<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.openmoko.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://wiki.openmoko.org/api.php?action=feedcontributions&amp;user=Fthiery&amp;feedformat=atom</id>
		<title>Openmoko - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.openmoko.org/api.php?action=feedcontributions&amp;user=Fthiery&amp;feedformat=atom"/>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Special:Contributions/Fthiery"/>
		<updated>2013-05-25T15:50:43Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.19.6</generator>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro</id>
		<title>Wishlist/LiveUSB distro</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro"/>
				<updated>2007-12-15T17:33:24Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* About USB Booting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{wishlist}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
NOTE: this page may be renamed: portable destkop&lt;br /&gt;
&lt;br /&gt;
An openmoko device could act as '''the perfect geeky swiss knive''': go anywhere with your Linux desktop and tools.&lt;br /&gt;
&lt;br /&gt;
YES, there are tons of liveCDs out there, but CDs/DVDs:&lt;br /&gt;
* get easily damaged&lt;br /&gt;
* don't fit in a pocket (except for businesscard-sized ones ; too exotic...)&lt;br /&gt;
* don't update or save settings/personal data without a supplementary USB device&lt;br /&gt;
&lt;br /&gt;
YES, there are LiveUSB distros but:&lt;br /&gt;
* a Neo/OpenMoko device IS sort of an USB stick; one object is better than two&lt;br /&gt;
* you may carry my cellphone everywhere, what about usb sticks or cds ?&lt;br /&gt;
&lt;br /&gt;
The biggest argument against these ones is that you'd have to carry an USB cable with you... But it's a standard one, which is good news :) An integrated zippable plug could be an interesting add-on...&lt;br /&gt;
&lt;br /&gt;
Similar functionality can be found in [http://en.wikipedia.org/wiki/Wizpy the Wizpy portable media player], but relies on different methods for working under Windows (cd-rom emulation).&lt;br /&gt;
&lt;br /&gt;
When the openmoko device is in mass storage mode, a host computer should be able to boot on it, presenting a grub menu offering to boot into several images / partitions (payloads) on the transflash: memtest, UBCD (the ultimate boot cd), a lightweight security oriented livecd distro, you name it... &lt;br /&gt;
&lt;br /&gt;
It's sometimes called Live USB: from [http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB definition], ''A live USB is a USB flash drive containing a full operating system which can be booted from. Live USBs are closely related to Live CDs, and are sometimes used interchangeably. Like Live CDs, Live USBs can be used for system administration, data recovery, or the testing of operating system distributions without committing to a permanent installation on the local hard drive. Many of the smaller Linux distributions can also be used from a USB flash drive.''&lt;br /&gt;
&lt;br /&gt;
Usually, all you need for this with an USB storage device (flash USB stick or external drive) is a partition, flagged &amp;quot;bootable&amp;quot; (see fdisk), containing a boot loader (say grub). But the problem is that specifications vary between motherboards, so there are variants and mandatory requirements to define (here would be a good idea), so that one can optimize/maximize the compatibility.&lt;br /&gt;
&lt;br /&gt;
==The perfect geek knife==&lt;br /&gt;
&lt;br /&gt;
We may want to start our own distro with the following constraints:&lt;br /&gt;
* Multiboot: small utilities/compilations + bull blown light OS&lt;br /&gt;
* Aiming at maximum hardware compatibility, possibly using liveCD technology (knoppix-based distros)&lt;br /&gt;
* Aiming at minimum resource+system footprint, and boot speed&lt;br /&gt;
* Being able to install software temporary (for the session) or permanently, upgradable&lt;br /&gt;
* Being able to use the phone features at the same time (access pim, data &amp;amp; calls)&lt;br /&gt;
&lt;br /&gt;
Optimally, being able to charge the device while plugged in would be great too.&lt;br /&gt;
&lt;br /&gt;
==About USB Booting==&lt;br /&gt;
&lt;br /&gt;
From [http://www.damnsmalllinux.org/wiki/index.php/USB_Booting DSL Wiki]:&lt;br /&gt;
&lt;br /&gt;
Older computer BIOS usually do not support direct booting from a USB device. Around 2001, PC motherboard manufacturers started to add USB boot support.&lt;br /&gt;
&lt;br /&gt;
There are two common BIOS methods for direct USB booting:&lt;br /&gt;
* One method is called the &amp;quot;USBHDD&amp;quot; method and it is used to support the booting of standard USB mass storage devices that are configured like a normal PC hard drive.&lt;br /&gt;
* The other method is called the &amp;quot;USBZIP&amp;quot; method and it supports booting from a USB storage device that behaves like the original IOMEGA ZIP drive with USB support. &lt;br /&gt;
&lt;br /&gt;
Most computers (just about all Dells, for example) made today have a BIOS that supports the USBHDD method so I expect that this will eventually become the standard way to boot a USB device. However, many motherboards will support BOTH methods, and many older motherboards have USBZIP support.&lt;br /&gt;
&lt;br /&gt;
Some newer BIOSs which support USB 2.0 will not boot from an older pen drive. Using a USB 2.0 compliant one usually solves this problem. Also, some older BIOSs which only support USB 1.1 will not boot from newer drives which support USB 2.0!&lt;br /&gt;
&lt;br /&gt;
Some USB keys don't boot. If this is the case, it may be possible to fix them by installing a new master boot record. (Most keys boot OK by default; some cannot be fixed even by doing this. However, it helps in some cases). Run the command:&lt;br /&gt;
&lt;br /&gt;
lilo -M /dev/$usbdevice&lt;br /&gt;
&lt;br /&gt;
(where usbdevice is the key, ex: /dev/sdb, checking '''dmesg''' shall give the appropriate one when plugging the neo in mass storage mode)&lt;br /&gt;
&lt;br /&gt;
==USB Booting in Neo1973's kernel==&lt;br /&gt;
&lt;br /&gt;
Although there is very little information about it, the g_storage kernel module is responsible for the Neo's mass storage mode. The boot-or-not criteria might rely on this very module.&lt;br /&gt;
&lt;br /&gt;
==TODO==&lt;br /&gt;
&lt;br /&gt;
Testing/further research has to be conducted to determine:&lt;br /&gt;
* if a bootable-flagged partition / grub doesn't mess openmoko up&lt;br /&gt;
* if the phone can still act as a phone, or if the booted os can use the gprs functions&lt;br /&gt;
* if the phone can recharge on mass storage mode (from the usb cable)&lt;br /&gt;
* if a dedicated partition for each payload is needed (see memtest example...)&lt;br /&gt;
* if multi-boot is possible: grub?&lt;br /&gt;
&lt;br /&gt;
==Linux distro Howto's: liveUSB creation==&lt;br /&gt;
&lt;br /&gt;
In short:&lt;br /&gt;
#Mount USB drive, with e.g. mount /dev/sda1 /flash - can be either FAT16 or FAT32!&lt;br /&gt;
#Mount ISO image, with e.g. mount /tmp/dsl-3.2.iso /tmp/iso -o loop&lt;br /&gt;
#Copy all contents from ISO to USB drive: cp -vr /tmp/iso/* /flash/&lt;br /&gt;
#Rename and move syslinux files to root directory: mv /flash/boot/isolinux/* /flash/&lt;br /&gt;
#Rename isolinux.cfg: mv /flash/isolinux.cfg /flash/syslinux.cfg&lt;br /&gt;
#Unmount USB drive: umount /flash&lt;br /&gt;
#Install syslinux: syslinux /dev/sda1 and eventually set the MBR boot flag for this partition (with fdisk). &lt;br /&gt;
&lt;br /&gt;
*Fedora Core's [http://revisor.fedoraunity.org Revisor] enables easy GUI-driven ISO customization, allowing to choose the output medium (CD/DVD/USB)&lt;br /&gt;
*[http://www.damnsmalllinux.org/wiki/index.php/Installing_to_a_USB_Flash_Drive Installing DSL to USB device - using grub]&lt;br /&gt;
*[http://wiki.debian.org/BootUsb Debian BootUSB - using Lilo]&lt;br /&gt;
*[http://www.debuntu.org/how-to-install-ubuntu-linux-on-usb-bar Howto install ubuntu (or any other distro) on usb stick]&lt;br /&gt;
*[http://www.gentoo.org/doc/en/liveusb.xml Gentoo on usb stick]&lt;br /&gt;
*[http://pendrivelinux.com/ Windows &amp;amp; Linux tutorials &amp;amp; resources]:     &lt;br /&gt;
    * Flash installation via Windows: XUbuntu, DSL, Knoppix, Slax, MiniMe&lt;br /&gt;
    * Flash installation via Linux: Ubuntu Edgy, Knoppix, PCLinuxOS&lt;br /&gt;
&lt;br /&gt;
'''Transflash partitioning schema example'''&lt;br /&gt;
&lt;br /&gt;
* 2 Gb: /dev/sd? (where N is the transflash's number)&lt;br /&gt;
* 700 Mb: /dev/sd?1 : containing bootable iso, FAT16&lt;br /&gt;
* 1300 Mb: /dev/sd?2 : openmoko &amp;amp; bootable os home partition, EXT3?&lt;br /&gt;
* + eventually a swap&lt;br /&gt;
&lt;br /&gt;
The limitation of this method is that the booted OS is static (not-self modifiable). There's the option to install linux using the partition, but it's not really mobility-oriented (liveCDs are optimized for maximum autoconfiguration).&lt;br /&gt;
&lt;br /&gt;
==Alternative methods==&lt;br /&gt;
&lt;br /&gt;
===Booting ISO files ?===&lt;br /&gt;
&lt;br /&gt;
* Grub? From [http://www.freesoftwaremagazine.com/articles/grub_intro#comment-12900 How to install grub on an usb pendrive]:&lt;br /&gt;
    If you want to boot from a iso file on a harddisk, do something in menu.lst like&lt;br /&gt;
    title Boot from iso on a harddisk&lt;br /&gt;
    map (hdX,Y)/your.iso (hdZ)&lt;br /&gt;
    map --rehook&lt;br /&gt;
    chainloader (hdZ)+1&lt;br /&gt;
    rootnoverify (hdZ)&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
Grub &amp;amp; memdisk can boot floppy images, but (AFAIK) not isos. Example from the stock /boot/grub/menu.lst ubuntu:&lt;br /&gt;
    title           Ubuntu, memtest86+&lt;br /&gt;
    root            (hd0,2)&lt;br /&gt;
    kernel          /memtest86+.bin&lt;br /&gt;
    quiet&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
''Using the memdisk kernel from the syslinux package, you can load disk images and execute them in a non-emulated environment.''&lt;br /&gt;
&lt;br /&gt;
* [http://www.knoppix.net/wiki/Cheat_Codes knoppix '''bootfrom''' cheatcode]&lt;br /&gt;
&lt;br /&gt;
    bootfrom=/dev/hda1/KNX.iso &lt;br /&gt;
&lt;br /&gt;
Bootfrom needs access to a running Knoppix-System '''with the same Kernel as the Bootkernel''', before it is able to mount the partition / ISO-Image.  &lt;br /&gt;
&lt;br /&gt;
* Maybe there's a way to achieve a boot cd iso selecter see ([http://www.linuxquestions.org/questions/showthread.php?t=528840 this post])&lt;br /&gt;
* virtualization-oriented distro... ex [http://unit.aist.go.jp/itri/knoppix/xen/index-en.html Xenoppix] Cons: would work best only on modern VT-capable computers. What about a very minimal distribution (say DSL without X) kqemu-enblaed, booting into an ncurses iso-loader? The delicate part would be on the networking side.&lt;br /&gt;
&lt;br /&gt;
===Zero-Install / Networked systems===&lt;br /&gt;
&lt;br /&gt;
*[http://klik.atekon.de/wiki/index.php/Main_Page Klik] with more than 1000 packages ported. See [http://klik.atekon.de/wiki/index.php/Comparison comparison chart].&lt;br /&gt;
*[http://0install.net/index.html The Zero Install System], with automatic dependancies, upgrading. See [http://0install.net/matrix.html] comparison chart.&lt;br /&gt;
*Why not rolling a [http://wiki.rpath.com/wiki/Conary:Concepts Conary/RPath-based] distro, based on [http://www.rpath.com/rbuilder/project/rpath/ rPath linux] reference distribution ? Or choose within the available ones...&lt;br /&gt;
* The FUSE [http://httpfs.sourceforge.net/net_boot.htm httpfs] may allow pure http net booting, downloading files from a distant livecd only when needed (this image may be very minimal though).&lt;br /&gt;
* [http://developer.amazonwebservices.com/connect/thread.jspa?threadID=10271&amp;amp;start=75&amp;amp;tstart=0 some people] are thinking of using Amazon S3 as virtual disk&lt;br /&gt;
&lt;br /&gt;
===Using Qemu to boot Linux from a flash drive within Windows===&lt;br /&gt;
&lt;br /&gt;
The following tutorial explains how to use Qemu to boot Linux from a portable USB flash device while still working within Windows. This Enables the user to have both systems running at the same time eliminating the need to restart the PC and set your BIOS options to boot Linux.&lt;br /&gt;
&lt;br /&gt;
[http://www.pendrivelinux.com/2007/03/09/use-qemu-to-boot-linux-from-windows/ PendriveLinux article]&lt;br /&gt;
&lt;br /&gt;
===Putting a vnc server on openmoko + IP over USB or BlueTooth/Wifi===&lt;br /&gt;
&lt;br /&gt;
That's another alternative :) Will bring a VGA-sized capture screen. However, given the current animated behaviour in openmoko, performance will be poor.&lt;br /&gt;
&lt;br /&gt;
===The BlackDog project===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;When plugged into the host computer’s USB port, BlackDog starts up, '''automatically launching the X Window system for Windows Xming and a software NAT router via an autorun application that the BlackDog presents to the host through a virtual USB CD-ROM. Once those applications are running, the virtual USB CD-ROM drive disconnects, and a virtual USB-to-Ethernet adapter is connected to provide the communications link.'''&lt;br /&gt;
&lt;br /&gt;
The host machine’s monitor, keyboard, mouse, and Internet connection are used by the BlackDog for the duration of the session.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The [http://en.wikipedia.org/wiki/BlackDog BlackDog server] project has lots of interesting concepts (and software). Could [http://www.jasonkolb.com/weblog/2006/11/idea_7_personal.html personal servers] change the face of computing ? Together with biometry, ''they open up the possibility of carrying your personal server, or an extension of it, with you on your physical person. The reason this is so exciting is because it enables biometric authentication that doesn't require shipping your biometric data to a third party'.&lt;br /&gt;
&lt;br /&gt;
==Interesting distros/payloads==&lt;br /&gt;
&lt;br /&gt;
'''System diagnostics / recovery'''&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Memtest Memtest86+] Very small&lt;br /&gt;
*[http://www.ultimatebootcd.com/ The Ultimate Boot CD]&lt;br /&gt;
*[http://www.sysresccd.org/Main_Page System Rescue CD]&lt;br /&gt;
*[http://www.tux.org/pub/people/kent-robotti/looplinux/rip/ Recovery IS Possible] &amp;lt; 80 MB&lt;br /&gt;
&lt;br /&gt;
'''General purpose'''&lt;br /&gt;
*[http://jinx-linux.sourceforge.net/ jinx-linux] &amp;lt; 50 MB&lt;br /&gt;
*[http://knoppix.com/ Knoppix] 700 MB CD-ROM&lt;br /&gt;
*[http://www.puppylinux.org PuppyLinux] &amp;lt; 100 MB&lt;br /&gt;
*[http://www.damnsmalllinux.org DSL] ~50 MB&lt;br /&gt;
*[http://gentoo-wiki.com/TinyGentoo#What_is_this_.3F TinyGentoo] 5 MB&lt;br /&gt;
&lt;br /&gt;
'''Security-oriented''': pentesting, forensics, anonymous webbrowsing&lt;br /&gt;
*[http://www.darknet.org.uk/2006/03/10-best-security-live-cd-distros-pen-test-forensics-recovery/ List of Security distros]&lt;br /&gt;
*[http://www.remote-exploit.org/backtrack.html Backtrack Livecd]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Anonym.OS Anonym.OS: browse the web anonymously]&lt;br /&gt;
*[http://dban.sourceforge.net/ Darik's Boot and Nuke]: ''dangerous''&lt;br /&gt;
*[http://byzgl.sourceforge.net/wiki/index.php/Main_Page Byzantine OS] is a webkiosk appliance (32/48 MB)&lt;br /&gt;
&lt;br /&gt;
The SabayonLinux distro offers a lot of [http://www.sabayonlinux.org/wiki/index.php?title=Sabayon_Linux#Boot_Methods_for_special_ways_of_using_Sabayon boot cheatcodes], such as booting onto GeexBox. We should take a look at the method used.&lt;br /&gt;
&lt;br /&gt;
'''[http://www.livecdlist.com/ List of live distros @ livecdlist.com]''' ''Includes sizes''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/List_of_LiveDistros List of live distros @ wikipedia]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://distrowatch.com/dwres.php?resource=cd List of live distros @ distrowatch]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB article]'''&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Talk:E17</id>
		<title>Talk:E17</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Talk:E17"/>
				<updated>2007-08-25T00:48:07Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Are there some news on the developement of the E17 version for OpenMoko? --[[User:Denis std|denis_std]] 22:28, 30 June 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
Yes, apparently the EFL are going to be used. Some video demos (ex kinetic scrolling) are around and seem to be made using EFL's, but nothing official. An e17 port is nowhere realistic in the contrary to EFL use (at least it won't before the hardware would take advantage of regular X apps -- ex. vga output + very good hardware).&lt;br /&gt;
--[[User:fthiery|flo]] 22:28, 30 June 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
EDIT: i was wrong, kinetic scrolling only relies on GTK+Cairo --[[User:fthiery|flo]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro</id>
		<title>Wishlist/LiveUSB distro</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro"/>
				<updated>2007-08-25T00:42:39Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Putting a vnc server on openmoko */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{wishlist}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
NOTE: this page may be renamed: portable destkop&lt;br /&gt;
&lt;br /&gt;
An openmoko device could act as '''the perfect geeky swiss knive''': go anywhere with your Linux desktop and tools.&lt;br /&gt;
&lt;br /&gt;
YES, there are tons of liveCDs out there, but CDs/DVDs:&lt;br /&gt;
* get easily damaged&lt;br /&gt;
* don't fit in a pocket (except for businesscard-sized ones ; too exotic...)&lt;br /&gt;
* don't update or save settings/personal data without a supplementary USB device&lt;br /&gt;
&lt;br /&gt;
YES, there are LiveUSB distros but:&lt;br /&gt;
* a Neo/OpenMoko device IS sort of an USB stick; one object is better than two&lt;br /&gt;
* you may carry my cellphone everywhere, what about usb sticks or cds ?&lt;br /&gt;
&lt;br /&gt;
The biggest argument against these ones is that you'd have to carry an USB cable with you... But it's a standard one, which is good news :) An integrated zippable plug could be an interesting add-on...&lt;br /&gt;
&lt;br /&gt;
Similar functionality can be found in [http://en.wikipedia.org/wiki/Wizpy the Wizpy portable media player], but relies on different methods for working under Windows (cd-rom emulation).&lt;br /&gt;
&lt;br /&gt;
When the openmoko device is in mass storage mode, a host computer should be able to boot on it, presenting a grub menu offering to boot into several images / partitions (payloads) on the transflash: memtest, UBCD (the ultimate boot cd), a lightweight security oriented livecd distro, you name it... &lt;br /&gt;
&lt;br /&gt;
It's sometimes called Live USB: from [http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB definition], ''A live USB is a USB flash drive containing a full operating system which can be booted from. Live USBs are closely related to Live CDs, and are sometimes used interchangeably. Like Live CDs, Live USBs can be used for system administration, data recovery, or the testing of operating system distributions without committing to a permanent installation on the local hard drive. Many of the smaller Linux distributions can also be used from a USB flash drive.''&lt;br /&gt;
&lt;br /&gt;
Usually, all you need for this with an USB storage device (flash USB stick or external drive) is a partition, flagged &amp;quot;bootable&amp;quot; (see fdisk), containing a boot loader (say grub). But the problem is that specifications vary between motherboards, so there are variants and mandatory requirements to define (here would be a good idea), so that one can optimize/maximize the compatibility.&lt;br /&gt;
&lt;br /&gt;
==The perfect geek knife==&lt;br /&gt;
&lt;br /&gt;
We may want to start our own distro with the following constraints:&lt;br /&gt;
* Multiboot: small utilities/compilations + bull blown light OS&lt;br /&gt;
* Aiming at maximum hardware compatibility, possibly using liveCD technology (knoppix-based distros)&lt;br /&gt;
* Aiming at minimum resource+system footprint, and boot speed&lt;br /&gt;
* Being able to install software temporary (for the session) or permanently, upgradable&lt;br /&gt;
* Being able to use the phone features at the same time (access pim, data &amp;amp; calls)&lt;br /&gt;
&lt;br /&gt;
Optimally, being able to charge the device while plugged in would be great too.&lt;br /&gt;
&lt;br /&gt;
==About USB Booting==&lt;br /&gt;
&lt;br /&gt;
From [http://www.damnsmalllinux.org/wiki/index.php/USB_Booting DSL Wiki]:&lt;br /&gt;
&lt;br /&gt;
Older computer BIOS usually do not support direct booting from a USB device. Around 2001, PC motherboard manufacturers started to add USB boot support.&lt;br /&gt;
&lt;br /&gt;
There are two common BIOS methods for direct USB booting:&lt;br /&gt;
* One method is called the &amp;quot;USBHDD&amp;quot; method and it is used to support the booting of standard USB mass storage devices that are configured like a normal PC hard drive.&lt;br /&gt;
* The other method is called the &amp;quot;USBZIP&amp;quot; method and it supports booting from a USB storage device that behaves like the original IOMEGA ZIP drive with USB support. &lt;br /&gt;
&lt;br /&gt;
Most computers (just about all Dells, for example) made today have a BIOS that supports the USBHDD method so I expect that this will eventually become the standard way to boot a USB device. However, many motherboards will support BOTH methods, and many older motherboards have USBZIP support.&lt;br /&gt;
&lt;br /&gt;
Some newer BIOSs which support USB 2.0 will not boot from an older pen drive. Using a USB 2.0 compliant one usually solves this problem. Also, some older BIOSs which only support USB 1.1 will not boot from newer drives which support USB 2.0!&lt;br /&gt;
&lt;br /&gt;
Some USB keys don't boot. If this is the case, it may be possible to fix them by installing a new master boot record. (Most keys boot OK by default; some cannot be fixed even by doing this. However, it helps in some cases). Run the command:&lt;br /&gt;
&lt;br /&gt;
''WARNING! May break your primary hard drive if it's named sda'' &lt;br /&gt;
&lt;br /&gt;
lilo -M /dev/sda&lt;br /&gt;
&lt;br /&gt;
==USB Booting in Neo1973's kernel==&lt;br /&gt;
&lt;br /&gt;
Although there is very little information about it, the g_storage kernel module is responsible for the Neo's mass storage mode. The boot-or-not criteria might rely on this very module.&lt;br /&gt;
&lt;br /&gt;
==TODO==&lt;br /&gt;
&lt;br /&gt;
Testing/further research has to be conducted to determine:&lt;br /&gt;
* if a bootable-flagged partition / grub doesn't mess openmoko up&lt;br /&gt;
* if the phone can still act as a phone, or if the booted os can use the gprs functions&lt;br /&gt;
* if the phone can recharge on mass storage mode (from the usb cable)&lt;br /&gt;
* if a dedicated partition for each payload is needed (see memtest example...)&lt;br /&gt;
* if multi-boot is possible: grub?&lt;br /&gt;
&lt;br /&gt;
==Linux distro Howto's: liveUSB creation==&lt;br /&gt;
&lt;br /&gt;
In short:&lt;br /&gt;
#Mount USB drive, with e.g. mount /dev/sda1 /flash - can be either FAT16 or FAT32!&lt;br /&gt;
#Mount ISO image, with e.g. mount /tmp/dsl-3.2.iso /tmp/iso -o loop&lt;br /&gt;
#Copy all contents from ISO to USB drive: cp -vr /tmp/iso/* /flash/&lt;br /&gt;
#Rename and move syslinux files to root directory: mv /flash/boot/isolinux/* /flash/&lt;br /&gt;
#Rename isolinux.cfg: mv /flash/isolinux.cfg /flash/syslinux.cfg&lt;br /&gt;
#Unmount USB drive: umount /flash&lt;br /&gt;
#Install syslinux: syslinux /dev/sda1 and eventually set the MBR boot flag for this partition (with fdisk). &lt;br /&gt;
&lt;br /&gt;
*Fedora Core's [http://revisor.fedoraunity.org Revisor] enables easy GUI-driven ISO customization, allowing to choose the output medium (CD/DVD/USB)&lt;br /&gt;
*[http://www.damnsmalllinux.org/wiki/index.php/Installing_to_a_USB_Flash_Drive Installing DSL to USB device - using grub]&lt;br /&gt;
*[http://wiki.debian.org/BootUsb Debian BootUSB - using Lilo]&lt;br /&gt;
*[http://www.debuntu.org/how-to-install-ubuntu-linux-on-usb-bar Howto install ubuntu (or any other distro) on usb stick]&lt;br /&gt;
*[http://www.gentoo.org/doc/en/liveusb.xml Gentoo on usb stick]&lt;br /&gt;
*[http://pendrivelinux.com/ Windows &amp;amp; Linux tutorials &amp;amp; resources]:     &lt;br /&gt;
    * Flash installation via Windows: XUbuntu, DSL, Knoppix, Slax, MiniMe&lt;br /&gt;
    * Flash installation via Linux: Ubuntu Edgy, Knoppix, PCLinuxOS&lt;br /&gt;
&lt;br /&gt;
'''Transflash partitioning schema example'''&lt;br /&gt;
&lt;br /&gt;
* 2 Gb: /dev/sd? (where N is the transflash's number)&lt;br /&gt;
* 700 Mb: /dev/sd?1 : containing bootable iso, FAT16&lt;br /&gt;
* 1300 Mb: /dev/sd?2 : openmoko &amp;amp; bootable os home partition, EXT3?&lt;br /&gt;
* + eventually a swap&lt;br /&gt;
&lt;br /&gt;
The limitation of this method is that the booted OS is static (not-self modifiable). There's the option to install linux using the partition, but it's not really mobility-oriented (liveCDs are optimized for maximum autoconfiguration).&lt;br /&gt;
&lt;br /&gt;
==Alternative methods==&lt;br /&gt;
&lt;br /&gt;
===Booting ISO files ?===&lt;br /&gt;
&lt;br /&gt;
* Grub? From [http://www.freesoftwaremagazine.com/articles/grub_intro#comment-12900 How to install grub on an usb pendrive]:&lt;br /&gt;
    If you want to boot from a iso file on a harddisk, do something in menu.lst like&lt;br /&gt;
    title Boot from iso on a harddisk&lt;br /&gt;
    map (hdX,Y)/your.iso (hdZ)&lt;br /&gt;
    map --rehook&lt;br /&gt;
    chainloader (hdZ)+1&lt;br /&gt;
    rootnoverify (hdZ)&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
Grub &amp;amp; memdisk can boot floppy images, but (AFAIK) not isos. Example from the stock /boot/grub/menu.lst ubuntu:&lt;br /&gt;
    title           Ubuntu, memtest86+&lt;br /&gt;
    root            (hd0,2)&lt;br /&gt;
    kernel          /memtest86+.bin&lt;br /&gt;
    quiet&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
''Using the memdisk kernel from the syslinux package, you can load disk images and execute them in a non-emulated environment.''&lt;br /&gt;
&lt;br /&gt;
* [http://www.knoppix.net/wiki/Cheat_Codes knoppix '''bootfrom''' cheatcode]&lt;br /&gt;
&lt;br /&gt;
    bootfrom=/dev/hda1/KNX.iso &lt;br /&gt;
&lt;br /&gt;
Bootfrom needs access to a running Knoppix-System '''with the same Kernel as the Bootkernel''', before it is able to mount the partition / ISO-Image.  &lt;br /&gt;
&lt;br /&gt;
* Maybe there's a way to achieve a boot cd iso selecter see ([http://www.linuxquestions.org/questions/showthread.php?t=528840 this post])&lt;br /&gt;
* virtualization-oriented distro... ex [http://unit.aist.go.jp/itri/knoppix/xen/index-en.html Xenoppix] Cons: would work best only on modern VT-capable computers. What about a very minimal distribution (say DSL without X) kqemu-enblaed, booting into an ncurses iso-loader? The delicate part would be on the networking side.&lt;br /&gt;
&lt;br /&gt;
===Zero-Install / Networked systems===&lt;br /&gt;
&lt;br /&gt;
*[http://klik.atekon.de/wiki/index.php/Main_Page Klik] with more than 1000 packages ported. See [http://klik.atekon.de/wiki/index.php/Comparison comparison chart].&lt;br /&gt;
*[http://0install.net/index.html The Zero Install System], with automatic dependancies, upgrading. See [http://0install.net/matrix.html] comparison chart.&lt;br /&gt;
*Why not rolling a [http://wiki.rpath.com/wiki/Conary:Concepts Conary/RPath-based] distro, based on [http://www.rpath.com/rbuilder/project/rpath/ rPath linux] reference distribution ? Or choose within the available ones...&lt;br /&gt;
* The FUSE [http://httpfs.sourceforge.net/net_boot.htm httpfs] may allow pure http net booting, downloading files from a distant livecd only when needed (this image may be very minimal though).&lt;br /&gt;
* [http://developer.amazonwebservices.com/connect/thread.jspa?threadID=10271&amp;amp;start=75&amp;amp;tstart=0 some people] are thinking of using Amazon S3 as virtual disk&lt;br /&gt;
&lt;br /&gt;
===Using Qemu to boot Linux from a flash drive within Windows===&lt;br /&gt;
&lt;br /&gt;
The following tutorial explains how to use Qemu to boot Linux from a portable USB flash device while still working within Windows. This Enables the user to have both systems running at the same time eliminating the need to restart the PC and set your BIOS options to boot Linux.&lt;br /&gt;
&lt;br /&gt;
[http://www.pendrivelinux.com/2007/03/09/use-qemu-to-boot-linux-from-windows/ PendriveLinux article]&lt;br /&gt;
&lt;br /&gt;
===Putting a vnc server on openmoko + IP over USB or BlueTooth/Wifi===&lt;br /&gt;
&lt;br /&gt;
That's another alternative :) Will bring a VGA-sized capture screen. However, given the current animated behaviour in openmoko, performance will be poor.&lt;br /&gt;
&lt;br /&gt;
===The BlackDog project===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;When plugged into the host computer’s USB port, BlackDog starts up, '''automatically launching the X Window system for Windows Xming and a software NAT router via an autorun application that the BlackDog presents to the host through a virtual USB CD-ROM. Once those applications are running, the virtual USB CD-ROM drive disconnects, and a virtual USB-to-Ethernet adapter is connected to provide the communications link.'''&lt;br /&gt;
&lt;br /&gt;
The host machine’s monitor, keyboard, mouse, and Internet connection are used by the BlackDog for the duration of the session.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The [http://en.wikipedia.org/wiki/BlackDog BlackDog server] project has lots of interesting concepts (and software). Could [http://www.jasonkolb.com/weblog/2006/11/idea_7_personal.html personal servers] change the face of computing ? Together with biometry, ''they open up the possibility of carrying your personal server, or an extension of it, with you on your physical person. The reason this is so exciting is because it enables biometric authentication that doesn't require shipping your biometric data to a third party'.&lt;br /&gt;
&lt;br /&gt;
==Interesting distros/payloads==&lt;br /&gt;
&lt;br /&gt;
'''System diagnostics / recovery'''&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Memtest Memtest86+] Very small&lt;br /&gt;
*[http://www.ultimatebootcd.com/ The Ultimate Boot CD]&lt;br /&gt;
*[http://www.sysresccd.org/Main_Page System Rescue CD]&lt;br /&gt;
*[http://www.tux.org/pub/people/kent-robotti/looplinux/rip/ Recovery IS Possible] &amp;lt; 80 MB&lt;br /&gt;
&lt;br /&gt;
'''General purpose'''&lt;br /&gt;
*[http://jinx-linux.sourceforge.net/ jinx-linux] &amp;lt; 50 MB&lt;br /&gt;
*[http://knoppix.com/ Knoppix] 700 MB CD-ROM&lt;br /&gt;
*[http://www.puppylinux.org PuppyLinux] &amp;lt; 100 MB&lt;br /&gt;
*[http://www.damnsmalllinux.org DSL] ~50 MB&lt;br /&gt;
*[http://gentoo-wiki.com/TinyGentoo#What_is_this_.3F TinyGentoo] 5 MB&lt;br /&gt;
&lt;br /&gt;
'''Security-oriented''': pentesting, forensics, anonymous webbrowsing&lt;br /&gt;
*[http://www.darknet.org.uk/2006/03/10-best-security-live-cd-distros-pen-test-forensics-recovery/ List of Security distros]&lt;br /&gt;
*[http://www.remote-exploit.org/backtrack.html Backtrack Livecd]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Anonym.OS Anonym.OS: browse the web anonymously]&lt;br /&gt;
*[http://dban.sourceforge.net/ Darik's Boot and Nuke]: ''dangerous''&lt;br /&gt;
*[http://byzgl.sourceforge.net/wiki/index.php/Main_Page Byzantine OS] is a webkiosk appliance (32/48 MB)&lt;br /&gt;
&lt;br /&gt;
The SabayonLinux distro offers a lot of [http://www.sabayonlinux.org/wiki/index.php?title=Sabayon_Linux#Boot_Methods_for_special_ways_of_using_Sabayon boot cheatcodes], such as booting onto GeexBox. We should take a look at the method used.&lt;br /&gt;
&lt;br /&gt;
'''[http://www.livecdlist.com/ List of live distros @ livecdlist.com]''' ''Includes sizes''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/List_of_LiveDistros List of live distros @ wikipedia]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://distrowatch.com/dwres.php?resource=cd List of live distros @ distrowatch]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB article]'''&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro</id>
		<title>Wishlist/LiveUSB distro</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro"/>
				<updated>2007-08-25T00:41:01Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Zero-Install / Networked systems */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{wishlist}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
NOTE: this page may be renamed: portable destkop&lt;br /&gt;
&lt;br /&gt;
An openmoko device could act as '''the perfect geeky swiss knive''': go anywhere with your Linux desktop and tools.&lt;br /&gt;
&lt;br /&gt;
YES, there are tons of liveCDs out there, but CDs/DVDs:&lt;br /&gt;
* get easily damaged&lt;br /&gt;
* don't fit in a pocket (except for businesscard-sized ones ; too exotic...)&lt;br /&gt;
* don't update or save settings/personal data without a supplementary USB device&lt;br /&gt;
&lt;br /&gt;
YES, there are LiveUSB distros but:&lt;br /&gt;
* a Neo/OpenMoko device IS sort of an USB stick; one object is better than two&lt;br /&gt;
* you may carry my cellphone everywhere, what about usb sticks or cds ?&lt;br /&gt;
&lt;br /&gt;
The biggest argument against these ones is that you'd have to carry an USB cable with you... But it's a standard one, which is good news :) An integrated zippable plug could be an interesting add-on...&lt;br /&gt;
&lt;br /&gt;
Similar functionality can be found in [http://en.wikipedia.org/wiki/Wizpy the Wizpy portable media player], but relies on different methods for working under Windows (cd-rom emulation).&lt;br /&gt;
&lt;br /&gt;
When the openmoko device is in mass storage mode, a host computer should be able to boot on it, presenting a grub menu offering to boot into several images / partitions (payloads) on the transflash: memtest, UBCD (the ultimate boot cd), a lightweight security oriented livecd distro, you name it... &lt;br /&gt;
&lt;br /&gt;
It's sometimes called Live USB: from [http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB definition], ''A live USB is a USB flash drive containing a full operating system which can be booted from. Live USBs are closely related to Live CDs, and are sometimes used interchangeably. Like Live CDs, Live USBs can be used for system administration, data recovery, or the testing of operating system distributions without committing to a permanent installation on the local hard drive. Many of the smaller Linux distributions can also be used from a USB flash drive.''&lt;br /&gt;
&lt;br /&gt;
Usually, all you need for this with an USB storage device (flash USB stick or external drive) is a partition, flagged &amp;quot;bootable&amp;quot; (see fdisk), containing a boot loader (say grub). But the problem is that specifications vary between motherboards, so there are variants and mandatory requirements to define (here would be a good idea), so that one can optimize/maximize the compatibility.&lt;br /&gt;
&lt;br /&gt;
==The perfect geek knife==&lt;br /&gt;
&lt;br /&gt;
We may want to start our own distro with the following constraints:&lt;br /&gt;
* Multiboot: small utilities/compilations + bull blown light OS&lt;br /&gt;
* Aiming at maximum hardware compatibility, possibly using liveCD technology (knoppix-based distros)&lt;br /&gt;
* Aiming at minimum resource+system footprint, and boot speed&lt;br /&gt;
* Being able to install software temporary (for the session) or permanently, upgradable&lt;br /&gt;
* Being able to use the phone features at the same time (access pim, data &amp;amp; calls)&lt;br /&gt;
&lt;br /&gt;
Optimally, being able to charge the device while plugged in would be great too.&lt;br /&gt;
&lt;br /&gt;
==About USB Booting==&lt;br /&gt;
&lt;br /&gt;
From [http://www.damnsmalllinux.org/wiki/index.php/USB_Booting DSL Wiki]:&lt;br /&gt;
&lt;br /&gt;
Older computer BIOS usually do not support direct booting from a USB device. Around 2001, PC motherboard manufacturers started to add USB boot support.&lt;br /&gt;
&lt;br /&gt;
There are two common BIOS methods for direct USB booting:&lt;br /&gt;
* One method is called the &amp;quot;USBHDD&amp;quot; method and it is used to support the booting of standard USB mass storage devices that are configured like a normal PC hard drive.&lt;br /&gt;
* The other method is called the &amp;quot;USBZIP&amp;quot; method and it supports booting from a USB storage device that behaves like the original IOMEGA ZIP drive with USB support. &lt;br /&gt;
&lt;br /&gt;
Most computers (just about all Dells, for example) made today have a BIOS that supports the USBHDD method so I expect that this will eventually become the standard way to boot a USB device. However, many motherboards will support BOTH methods, and many older motherboards have USBZIP support.&lt;br /&gt;
&lt;br /&gt;
Some newer BIOSs which support USB 2.0 will not boot from an older pen drive. Using a USB 2.0 compliant one usually solves this problem. Also, some older BIOSs which only support USB 1.1 will not boot from newer drives which support USB 2.0!&lt;br /&gt;
&lt;br /&gt;
Some USB keys don't boot. If this is the case, it may be possible to fix them by installing a new master boot record. (Most keys boot OK by default; some cannot be fixed even by doing this. However, it helps in some cases). Run the command:&lt;br /&gt;
&lt;br /&gt;
''WARNING! May break your primary hard drive if it's named sda'' &lt;br /&gt;
&lt;br /&gt;
lilo -M /dev/sda&lt;br /&gt;
&lt;br /&gt;
==USB Booting in Neo1973's kernel==&lt;br /&gt;
&lt;br /&gt;
Although there is very little information about it, the g_storage kernel module is responsible for the Neo's mass storage mode. The boot-or-not criteria might rely on this very module.&lt;br /&gt;
&lt;br /&gt;
==TODO==&lt;br /&gt;
&lt;br /&gt;
Testing/further research has to be conducted to determine:&lt;br /&gt;
* if a bootable-flagged partition / grub doesn't mess openmoko up&lt;br /&gt;
* if the phone can still act as a phone, or if the booted os can use the gprs functions&lt;br /&gt;
* if the phone can recharge on mass storage mode (from the usb cable)&lt;br /&gt;
* if a dedicated partition for each payload is needed (see memtest example...)&lt;br /&gt;
* if multi-boot is possible: grub?&lt;br /&gt;
&lt;br /&gt;
==Linux distro Howto's: liveUSB creation==&lt;br /&gt;
&lt;br /&gt;
In short:&lt;br /&gt;
#Mount USB drive, with e.g. mount /dev/sda1 /flash - can be either FAT16 or FAT32!&lt;br /&gt;
#Mount ISO image, with e.g. mount /tmp/dsl-3.2.iso /tmp/iso -o loop&lt;br /&gt;
#Copy all contents from ISO to USB drive: cp -vr /tmp/iso/* /flash/&lt;br /&gt;
#Rename and move syslinux files to root directory: mv /flash/boot/isolinux/* /flash/&lt;br /&gt;
#Rename isolinux.cfg: mv /flash/isolinux.cfg /flash/syslinux.cfg&lt;br /&gt;
#Unmount USB drive: umount /flash&lt;br /&gt;
#Install syslinux: syslinux /dev/sda1 and eventually set the MBR boot flag for this partition (with fdisk). &lt;br /&gt;
&lt;br /&gt;
*Fedora Core's [http://revisor.fedoraunity.org Revisor] enables easy GUI-driven ISO customization, allowing to choose the output medium (CD/DVD/USB)&lt;br /&gt;
*[http://www.damnsmalllinux.org/wiki/index.php/Installing_to_a_USB_Flash_Drive Installing DSL to USB device - using grub]&lt;br /&gt;
*[http://wiki.debian.org/BootUsb Debian BootUSB - using Lilo]&lt;br /&gt;
*[http://www.debuntu.org/how-to-install-ubuntu-linux-on-usb-bar Howto install ubuntu (or any other distro) on usb stick]&lt;br /&gt;
*[http://www.gentoo.org/doc/en/liveusb.xml Gentoo on usb stick]&lt;br /&gt;
*[http://pendrivelinux.com/ Windows &amp;amp; Linux tutorials &amp;amp; resources]:     &lt;br /&gt;
    * Flash installation via Windows: XUbuntu, DSL, Knoppix, Slax, MiniMe&lt;br /&gt;
    * Flash installation via Linux: Ubuntu Edgy, Knoppix, PCLinuxOS&lt;br /&gt;
&lt;br /&gt;
'''Transflash partitioning schema example'''&lt;br /&gt;
&lt;br /&gt;
* 2 Gb: /dev/sd? (where N is the transflash's number)&lt;br /&gt;
* 700 Mb: /dev/sd?1 : containing bootable iso, FAT16&lt;br /&gt;
* 1300 Mb: /dev/sd?2 : openmoko &amp;amp; bootable os home partition, EXT3?&lt;br /&gt;
* + eventually a swap&lt;br /&gt;
&lt;br /&gt;
The limitation of this method is that the booted OS is static (not-self modifiable). There's the option to install linux using the partition, but it's not really mobility-oriented (liveCDs are optimized for maximum autoconfiguration).&lt;br /&gt;
&lt;br /&gt;
==Alternative methods==&lt;br /&gt;
&lt;br /&gt;
===Booting ISO files ?===&lt;br /&gt;
&lt;br /&gt;
* Grub? From [http://www.freesoftwaremagazine.com/articles/grub_intro#comment-12900 How to install grub on an usb pendrive]:&lt;br /&gt;
    If you want to boot from a iso file on a harddisk, do something in menu.lst like&lt;br /&gt;
    title Boot from iso on a harddisk&lt;br /&gt;
    map (hdX,Y)/your.iso (hdZ)&lt;br /&gt;
    map --rehook&lt;br /&gt;
    chainloader (hdZ)+1&lt;br /&gt;
    rootnoverify (hdZ)&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
Grub &amp;amp; memdisk can boot floppy images, but (AFAIK) not isos. Example from the stock /boot/grub/menu.lst ubuntu:&lt;br /&gt;
    title           Ubuntu, memtest86+&lt;br /&gt;
    root            (hd0,2)&lt;br /&gt;
    kernel          /memtest86+.bin&lt;br /&gt;
    quiet&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
''Using the memdisk kernel from the syslinux package, you can load disk images and execute them in a non-emulated environment.''&lt;br /&gt;
&lt;br /&gt;
* [http://www.knoppix.net/wiki/Cheat_Codes knoppix '''bootfrom''' cheatcode]&lt;br /&gt;
&lt;br /&gt;
    bootfrom=/dev/hda1/KNX.iso &lt;br /&gt;
&lt;br /&gt;
Bootfrom needs access to a running Knoppix-System '''with the same Kernel as the Bootkernel''', before it is able to mount the partition / ISO-Image.  &lt;br /&gt;
&lt;br /&gt;
* Maybe there's a way to achieve a boot cd iso selecter see ([http://www.linuxquestions.org/questions/showthread.php?t=528840 this post])&lt;br /&gt;
* virtualization-oriented distro... ex [http://unit.aist.go.jp/itri/knoppix/xen/index-en.html Xenoppix] Cons: would work best only on modern VT-capable computers. What about a very minimal distribution (say DSL without X) kqemu-enblaed, booting into an ncurses iso-loader? The delicate part would be on the networking side.&lt;br /&gt;
&lt;br /&gt;
===Zero-Install / Networked systems===&lt;br /&gt;
&lt;br /&gt;
*[http://klik.atekon.de/wiki/index.php/Main_Page Klik] with more than 1000 packages ported. See [http://klik.atekon.de/wiki/index.php/Comparison comparison chart].&lt;br /&gt;
*[http://0install.net/index.html The Zero Install System], with automatic dependancies, upgrading. See [http://0install.net/matrix.html] comparison chart.&lt;br /&gt;
*Why not rolling a [http://wiki.rpath.com/wiki/Conary:Concepts Conary/RPath-based] distro, based on [http://www.rpath.com/rbuilder/project/rpath/ rPath linux] reference distribution ? Or choose within the available ones...&lt;br /&gt;
* The FUSE [http://httpfs.sourceforge.net/net_boot.htm httpfs] may allow pure http net booting, downloading files from a distant livecd only when needed (this image may be very minimal though).&lt;br /&gt;
* [http://developer.amazonwebservices.com/connect/thread.jspa?threadID=10271&amp;amp;start=75&amp;amp;tstart=0 some people] are thinking of using Amazon S3 as virtual disk&lt;br /&gt;
&lt;br /&gt;
===Using Qemu to boot Linux from a flash drive within Windows===&lt;br /&gt;
&lt;br /&gt;
The following tutorial explains how to use Qemu to boot Linux from a portable USB flash device while still working within Windows. This Enables the user to have both systems running at the same time eliminating the need to restart the PC and set your BIOS options to boot Linux.&lt;br /&gt;
&lt;br /&gt;
[http://www.pendrivelinux.com/2007/03/09/use-qemu-to-boot-linux-from-windows/ PendriveLinux article]&lt;br /&gt;
&lt;br /&gt;
===Putting a vnc server on openmoko===&lt;br /&gt;
&lt;br /&gt;
That's another alternative :)&lt;br /&gt;
&lt;br /&gt;
===The BlackDog project===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;When plugged into the host computer’s USB port, BlackDog starts up, '''automatically launching the X Window system for Windows Xming and a software NAT router via an autorun application that the BlackDog presents to the host through a virtual USB CD-ROM. Once those applications are running, the virtual USB CD-ROM drive disconnects, and a virtual USB-to-Ethernet adapter is connected to provide the communications link.'''&lt;br /&gt;
&lt;br /&gt;
The host machine’s monitor, keyboard, mouse, and Internet connection are used by the BlackDog for the duration of the session.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The [http://en.wikipedia.org/wiki/BlackDog BlackDog server] project has lots of interesting concepts (and software). Could [http://www.jasonkolb.com/weblog/2006/11/idea_7_personal.html personal servers] change the face of computing ? Together with biometry, ''they open up the possibility of carrying your personal server, or an extension of it, with you on your physical person. The reason this is so exciting is because it enables biometric authentication that doesn't require shipping your biometric data to a third party'.&lt;br /&gt;
&lt;br /&gt;
==Interesting distros/payloads==&lt;br /&gt;
&lt;br /&gt;
'''System diagnostics / recovery'''&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Memtest Memtest86+] Very small&lt;br /&gt;
*[http://www.ultimatebootcd.com/ The Ultimate Boot CD]&lt;br /&gt;
*[http://www.sysresccd.org/Main_Page System Rescue CD]&lt;br /&gt;
*[http://www.tux.org/pub/people/kent-robotti/looplinux/rip/ Recovery IS Possible] &amp;lt; 80 MB&lt;br /&gt;
&lt;br /&gt;
'''General purpose'''&lt;br /&gt;
*[http://jinx-linux.sourceforge.net/ jinx-linux] &amp;lt; 50 MB&lt;br /&gt;
*[http://knoppix.com/ Knoppix] 700 MB CD-ROM&lt;br /&gt;
*[http://www.puppylinux.org PuppyLinux] &amp;lt; 100 MB&lt;br /&gt;
*[http://www.damnsmalllinux.org DSL] ~50 MB&lt;br /&gt;
*[http://gentoo-wiki.com/TinyGentoo#What_is_this_.3F TinyGentoo] 5 MB&lt;br /&gt;
&lt;br /&gt;
'''Security-oriented''': pentesting, forensics, anonymous webbrowsing&lt;br /&gt;
*[http://www.darknet.org.uk/2006/03/10-best-security-live-cd-distros-pen-test-forensics-recovery/ List of Security distros]&lt;br /&gt;
*[http://www.remote-exploit.org/backtrack.html Backtrack Livecd]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Anonym.OS Anonym.OS: browse the web anonymously]&lt;br /&gt;
*[http://dban.sourceforge.net/ Darik's Boot and Nuke]: ''dangerous''&lt;br /&gt;
*[http://byzgl.sourceforge.net/wiki/index.php/Main_Page Byzantine OS] is a webkiosk appliance (32/48 MB)&lt;br /&gt;
&lt;br /&gt;
The SabayonLinux distro offers a lot of [http://www.sabayonlinux.org/wiki/index.php?title=Sabayon_Linux#Boot_Methods_for_special_ways_of_using_Sabayon boot cheatcodes], such as booting onto GeexBox. We should take a look at the method used.&lt;br /&gt;
&lt;br /&gt;
'''[http://www.livecdlist.com/ List of live distros @ livecdlist.com]''' ''Includes sizes''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/List_of_LiveDistros List of live distros @ wikipedia]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://distrowatch.com/dwres.php?resource=cd List of live distros @ distrowatch]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB article]'''&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro</id>
		<title>Wishlist/LiveUSB distro</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro"/>
				<updated>2007-08-25T00:40:23Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Booting ISOs ? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{wishlist}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
NOTE: this page may be renamed: portable destkop&lt;br /&gt;
&lt;br /&gt;
An openmoko device could act as '''the perfect geeky swiss knive''': go anywhere with your Linux desktop and tools.&lt;br /&gt;
&lt;br /&gt;
YES, there are tons of liveCDs out there, but CDs/DVDs:&lt;br /&gt;
* get easily damaged&lt;br /&gt;
* don't fit in a pocket (except for businesscard-sized ones ; too exotic...)&lt;br /&gt;
* don't update or save settings/personal data without a supplementary USB device&lt;br /&gt;
&lt;br /&gt;
YES, there are LiveUSB distros but:&lt;br /&gt;
* a Neo/OpenMoko device IS sort of an USB stick; one object is better than two&lt;br /&gt;
* you may carry my cellphone everywhere, what about usb sticks or cds ?&lt;br /&gt;
&lt;br /&gt;
The biggest argument against these ones is that you'd have to carry an USB cable with you... But it's a standard one, which is good news :) An integrated zippable plug could be an interesting add-on...&lt;br /&gt;
&lt;br /&gt;
Similar functionality can be found in [http://en.wikipedia.org/wiki/Wizpy the Wizpy portable media player], but relies on different methods for working under Windows (cd-rom emulation).&lt;br /&gt;
&lt;br /&gt;
When the openmoko device is in mass storage mode, a host computer should be able to boot on it, presenting a grub menu offering to boot into several images / partitions (payloads) on the transflash: memtest, UBCD (the ultimate boot cd), a lightweight security oriented livecd distro, you name it... &lt;br /&gt;
&lt;br /&gt;
It's sometimes called Live USB: from [http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB definition], ''A live USB is a USB flash drive containing a full operating system which can be booted from. Live USBs are closely related to Live CDs, and are sometimes used interchangeably. Like Live CDs, Live USBs can be used for system administration, data recovery, or the testing of operating system distributions without committing to a permanent installation on the local hard drive. Many of the smaller Linux distributions can also be used from a USB flash drive.''&lt;br /&gt;
&lt;br /&gt;
Usually, all you need for this with an USB storage device (flash USB stick or external drive) is a partition, flagged &amp;quot;bootable&amp;quot; (see fdisk), containing a boot loader (say grub). But the problem is that specifications vary between motherboards, so there are variants and mandatory requirements to define (here would be a good idea), so that one can optimize/maximize the compatibility.&lt;br /&gt;
&lt;br /&gt;
==The perfect geek knife==&lt;br /&gt;
&lt;br /&gt;
We may want to start our own distro with the following constraints:&lt;br /&gt;
* Multiboot: small utilities/compilations + bull blown light OS&lt;br /&gt;
* Aiming at maximum hardware compatibility, possibly using liveCD technology (knoppix-based distros)&lt;br /&gt;
* Aiming at minimum resource+system footprint, and boot speed&lt;br /&gt;
* Being able to install software temporary (for the session) or permanently, upgradable&lt;br /&gt;
* Being able to use the phone features at the same time (access pim, data &amp;amp; calls)&lt;br /&gt;
&lt;br /&gt;
Optimally, being able to charge the device while plugged in would be great too.&lt;br /&gt;
&lt;br /&gt;
==About USB Booting==&lt;br /&gt;
&lt;br /&gt;
From [http://www.damnsmalllinux.org/wiki/index.php/USB_Booting DSL Wiki]:&lt;br /&gt;
&lt;br /&gt;
Older computer BIOS usually do not support direct booting from a USB device. Around 2001, PC motherboard manufacturers started to add USB boot support.&lt;br /&gt;
&lt;br /&gt;
There are two common BIOS methods for direct USB booting:&lt;br /&gt;
* One method is called the &amp;quot;USBHDD&amp;quot; method and it is used to support the booting of standard USB mass storage devices that are configured like a normal PC hard drive.&lt;br /&gt;
* The other method is called the &amp;quot;USBZIP&amp;quot; method and it supports booting from a USB storage device that behaves like the original IOMEGA ZIP drive with USB support. &lt;br /&gt;
&lt;br /&gt;
Most computers (just about all Dells, for example) made today have a BIOS that supports the USBHDD method so I expect that this will eventually become the standard way to boot a USB device. However, many motherboards will support BOTH methods, and many older motherboards have USBZIP support.&lt;br /&gt;
&lt;br /&gt;
Some newer BIOSs which support USB 2.0 will not boot from an older pen drive. Using a USB 2.0 compliant one usually solves this problem. Also, some older BIOSs which only support USB 1.1 will not boot from newer drives which support USB 2.0!&lt;br /&gt;
&lt;br /&gt;
Some USB keys don't boot. If this is the case, it may be possible to fix them by installing a new master boot record. (Most keys boot OK by default; some cannot be fixed even by doing this. However, it helps in some cases). Run the command:&lt;br /&gt;
&lt;br /&gt;
''WARNING! May break your primary hard drive if it's named sda'' &lt;br /&gt;
&lt;br /&gt;
lilo -M /dev/sda&lt;br /&gt;
&lt;br /&gt;
==USB Booting in Neo1973's kernel==&lt;br /&gt;
&lt;br /&gt;
Although there is very little information about it, the g_storage kernel module is responsible for the Neo's mass storage mode. The boot-or-not criteria might rely on this very module.&lt;br /&gt;
&lt;br /&gt;
==TODO==&lt;br /&gt;
&lt;br /&gt;
Testing/further research has to be conducted to determine:&lt;br /&gt;
* if a bootable-flagged partition / grub doesn't mess openmoko up&lt;br /&gt;
* if the phone can still act as a phone, or if the booted os can use the gprs functions&lt;br /&gt;
* if the phone can recharge on mass storage mode (from the usb cable)&lt;br /&gt;
* if a dedicated partition for each payload is needed (see memtest example...)&lt;br /&gt;
* if multi-boot is possible: grub?&lt;br /&gt;
&lt;br /&gt;
==Linux distro Howto's: liveUSB creation==&lt;br /&gt;
&lt;br /&gt;
In short:&lt;br /&gt;
#Mount USB drive, with e.g. mount /dev/sda1 /flash - can be either FAT16 or FAT32!&lt;br /&gt;
#Mount ISO image, with e.g. mount /tmp/dsl-3.2.iso /tmp/iso -o loop&lt;br /&gt;
#Copy all contents from ISO to USB drive: cp -vr /tmp/iso/* /flash/&lt;br /&gt;
#Rename and move syslinux files to root directory: mv /flash/boot/isolinux/* /flash/&lt;br /&gt;
#Rename isolinux.cfg: mv /flash/isolinux.cfg /flash/syslinux.cfg&lt;br /&gt;
#Unmount USB drive: umount /flash&lt;br /&gt;
#Install syslinux: syslinux /dev/sda1 and eventually set the MBR boot flag for this partition (with fdisk). &lt;br /&gt;
&lt;br /&gt;
*Fedora Core's [http://revisor.fedoraunity.org Revisor] enables easy GUI-driven ISO customization, allowing to choose the output medium (CD/DVD/USB)&lt;br /&gt;
*[http://www.damnsmalllinux.org/wiki/index.php/Installing_to_a_USB_Flash_Drive Installing DSL to USB device - using grub]&lt;br /&gt;
*[http://wiki.debian.org/BootUsb Debian BootUSB - using Lilo]&lt;br /&gt;
*[http://www.debuntu.org/how-to-install-ubuntu-linux-on-usb-bar Howto install ubuntu (or any other distro) on usb stick]&lt;br /&gt;
*[http://www.gentoo.org/doc/en/liveusb.xml Gentoo on usb stick]&lt;br /&gt;
*[http://pendrivelinux.com/ Windows &amp;amp; Linux tutorials &amp;amp; resources]:     &lt;br /&gt;
    * Flash installation via Windows: XUbuntu, DSL, Knoppix, Slax, MiniMe&lt;br /&gt;
    * Flash installation via Linux: Ubuntu Edgy, Knoppix, PCLinuxOS&lt;br /&gt;
&lt;br /&gt;
'''Transflash partitioning schema example'''&lt;br /&gt;
&lt;br /&gt;
* 2 Gb: /dev/sd? (where N is the transflash's number)&lt;br /&gt;
* 700 Mb: /dev/sd?1 : containing bootable iso, FAT16&lt;br /&gt;
* 1300 Mb: /dev/sd?2 : openmoko &amp;amp; bootable os home partition, EXT3?&lt;br /&gt;
* + eventually a swap&lt;br /&gt;
&lt;br /&gt;
The limitation of this method is that the booted OS is static (not-self modifiable). There's the option to install linux using the partition, but it's not really mobility-oriented (liveCDs are optimized for maximum autoconfiguration).&lt;br /&gt;
&lt;br /&gt;
==Alternative methods==&lt;br /&gt;
&lt;br /&gt;
===Booting ISO files ?===&lt;br /&gt;
&lt;br /&gt;
* Grub? From [http://www.freesoftwaremagazine.com/articles/grub_intro#comment-12900 How to install grub on an usb pendrive]:&lt;br /&gt;
    If you want to boot from a iso file on a harddisk, do something in menu.lst like&lt;br /&gt;
    title Boot from iso on a harddisk&lt;br /&gt;
    map (hdX,Y)/your.iso (hdZ)&lt;br /&gt;
    map --rehook&lt;br /&gt;
    chainloader (hdZ)+1&lt;br /&gt;
    rootnoverify (hdZ)&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
Grub &amp;amp; memdisk can boot floppy images, but (AFAIK) not isos. Example from the stock /boot/grub/menu.lst ubuntu:&lt;br /&gt;
    title           Ubuntu, memtest86+&lt;br /&gt;
    root            (hd0,2)&lt;br /&gt;
    kernel          /memtest86+.bin&lt;br /&gt;
    quiet&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
''Using the memdisk kernel from the syslinux package, you can load disk images and execute them in a non-emulated environment.''&lt;br /&gt;
&lt;br /&gt;
* [http://www.knoppix.net/wiki/Cheat_Codes knoppix '''bootfrom''' cheatcode]&lt;br /&gt;
&lt;br /&gt;
    bootfrom=/dev/hda1/KNX.iso &lt;br /&gt;
&lt;br /&gt;
Bootfrom needs access to a running Knoppix-System '''with the same Kernel as the Bootkernel''', before it is able to mount the partition / ISO-Image.  &lt;br /&gt;
&lt;br /&gt;
* Maybe there's a way to achieve a boot cd iso selecter see ([http://www.linuxquestions.org/questions/showthread.php?t=528840 this post])&lt;br /&gt;
* virtualization-oriented distro... ex [http://unit.aist.go.jp/itri/knoppix/xen/index-en.html Xenoppix] Cons: would work best only on modern VT-capable computers. What about a very minimal distribution (say DSL without X) kqemu-enblaed, booting into an ncurses iso-loader? The delicate part would be on the networking side.&lt;br /&gt;
&lt;br /&gt;
===Zero-Install / Networked systems===&lt;br /&gt;
&lt;br /&gt;
*[http://klik.atekon.de/wiki/index.php/Main_Page Klik] with more than 1000 packages ported. See [http://klik.atekon.de/wiki/index.php/Comparison comparison chart].&lt;br /&gt;
*[http://0install.net/index.html The Zero Install System], with automatic dependancies, upgrading. See [http://0install.net/matrix.html] comparison chart.&lt;br /&gt;
*Why not rolling a [http://wiki.rpath.com/wiki/Conary:Concepts Conary/RPath-based] distro, based on [http://www.rpath.com/rbuilder/project/rpath/ rPath linux] reference distribution ? Or choose within the available ones...&lt;br /&gt;
* The FUSE [http://httpfs.sourceforge.net/net_boot.htm httpfs] may allow pure http net booting, downloading files from a distant livecd only when needed (this image may be very minimal though).&lt;br /&gt;
* [http://developer.amazonwebservices.com/connect/thread.jspa?threadID=10271&amp;amp;start=75&amp;amp;tstart=0 some people] hare thinking of using Amazon S3 as virtual disk&lt;br /&gt;
&lt;br /&gt;
===Using Qemu to boot Linux from a flash drive within Windows===&lt;br /&gt;
&lt;br /&gt;
The following tutorial explains how to use Qemu to boot Linux from a portable USB flash device while still working within Windows. This Enables the user to have both systems running at the same time eliminating the need to restart the PC and set your BIOS options to boot Linux.&lt;br /&gt;
&lt;br /&gt;
[http://www.pendrivelinux.com/2007/03/09/use-qemu-to-boot-linux-from-windows/ PendriveLinux article]&lt;br /&gt;
&lt;br /&gt;
===Putting a vnc server on openmoko===&lt;br /&gt;
&lt;br /&gt;
That's another alternative :)&lt;br /&gt;
&lt;br /&gt;
===The BlackDog project===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;When plugged into the host computer’s USB port, BlackDog starts up, '''automatically launching the X Window system for Windows Xming and a software NAT router via an autorun application that the BlackDog presents to the host through a virtual USB CD-ROM. Once those applications are running, the virtual USB CD-ROM drive disconnects, and a virtual USB-to-Ethernet adapter is connected to provide the communications link.'''&lt;br /&gt;
&lt;br /&gt;
The host machine’s monitor, keyboard, mouse, and Internet connection are used by the BlackDog for the duration of the session.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The [http://en.wikipedia.org/wiki/BlackDog BlackDog server] project has lots of interesting concepts (and software). Could [http://www.jasonkolb.com/weblog/2006/11/idea_7_personal.html personal servers] change the face of computing ? Together with biometry, ''they open up the possibility of carrying your personal server, or an extension of it, with you on your physical person. The reason this is so exciting is because it enables biometric authentication that doesn't require shipping your biometric data to a third party'.&lt;br /&gt;
&lt;br /&gt;
==Interesting distros/payloads==&lt;br /&gt;
&lt;br /&gt;
'''System diagnostics / recovery'''&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Memtest Memtest86+] Very small&lt;br /&gt;
*[http://www.ultimatebootcd.com/ The Ultimate Boot CD]&lt;br /&gt;
*[http://www.sysresccd.org/Main_Page System Rescue CD]&lt;br /&gt;
*[http://www.tux.org/pub/people/kent-robotti/looplinux/rip/ Recovery IS Possible] &amp;lt; 80 MB&lt;br /&gt;
&lt;br /&gt;
'''General purpose'''&lt;br /&gt;
*[http://jinx-linux.sourceforge.net/ jinx-linux] &amp;lt; 50 MB&lt;br /&gt;
*[http://knoppix.com/ Knoppix] 700 MB CD-ROM&lt;br /&gt;
*[http://www.puppylinux.org PuppyLinux] &amp;lt; 100 MB&lt;br /&gt;
*[http://www.damnsmalllinux.org DSL] ~50 MB&lt;br /&gt;
*[http://gentoo-wiki.com/TinyGentoo#What_is_this_.3F TinyGentoo] 5 MB&lt;br /&gt;
&lt;br /&gt;
'''Security-oriented''': pentesting, forensics, anonymous webbrowsing&lt;br /&gt;
*[http://www.darknet.org.uk/2006/03/10-best-security-live-cd-distros-pen-test-forensics-recovery/ List of Security distros]&lt;br /&gt;
*[http://www.remote-exploit.org/backtrack.html Backtrack Livecd]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Anonym.OS Anonym.OS: browse the web anonymously]&lt;br /&gt;
*[http://dban.sourceforge.net/ Darik's Boot and Nuke]: ''dangerous''&lt;br /&gt;
*[http://byzgl.sourceforge.net/wiki/index.php/Main_Page Byzantine OS] is a webkiosk appliance (32/48 MB)&lt;br /&gt;
&lt;br /&gt;
The SabayonLinux distro offers a lot of [http://www.sabayonlinux.org/wiki/index.php?title=Sabayon_Linux#Boot_Methods_for_special_ways_of_using_Sabayon boot cheatcodes], such as booting onto GeexBox. We should take a look at the method used.&lt;br /&gt;
&lt;br /&gt;
'''[http://www.livecdlist.com/ List of live distros @ livecdlist.com]''' ''Includes sizes''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/List_of_LiveDistros List of live distros @ wikipedia]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://distrowatch.com/dwres.php?resource=cd List of live distros @ distrowatch]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB article]'''&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro</id>
		<title>Wishlist/LiveUSB distro</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro"/>
				<updated>2007-08-25T00:40:00Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: Fixed typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{wishlist}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
NOTE: this page may be renamed: portable destkop&lt;br /&gt;
&lt;br /&gt;
An openmoko device could act as '''the perfect geeky swiss knive''': go anywhere with your Linux desktop and tools.&lt;br /&gt;
&lt;br /&gt;
YES, there are tons of liveCDs out there, but CDs/DVDs:&lt;br /&gt;
* get easily damaged&lt;br /&gt;
* don't fit in a pocket (except for businesscard-sized ones ; too exotic...)&lt;br /&gt;
* don't update or save settings/personal data without a supplementary USB device&lt;br /&gt;
&lt;br /&gt;
YES, there are LiveUSB distros but:&lt;br /&gt;
* a Neo/OpenMoko device IS sort of an USB stick; one object is better than two&lt;br /&gt;
* you may carry my cellphone everywhere, what about usb sticks or cds ?&lt;br /&gt;
&lt;br /&gt;
The biggest argument against these ones is that you'd have to carry an USB cable with you... But it's a standard one, which is good news :) An integrated zippable plug could be an interesting add-on...&lt;br /&gt;
&lt;br /&gt;
Similar functionality can be found in [http://en.wikipedia.org/wiki/Wizpy the Wizpy portable media player], but relies on different methods for working under Windows (cd-rom emulation).&lt;br /&gt;
&lt;br /&gt;
When the openmoko device is in mass storage mode, a host computer should be able to boot on it, presenting a grub menu offering to boot into several images / partitions (payloads) on the transflash: memtest, UBCD (the ultimate boot cd), a lightweight security oriented livecd distro, you name it... &lt;br /&gt;
&lt;br /&gt;
It's sometimes called Live USB: from [http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB definition], ''A live USB is a USB flash drive containing a full operating system which can be booted from. Live USBs are closely related to Live CDs, and are sometimes used interchangeably. Like Live CDs, Live USBs can be used for system administration, data recovery, or the testing of operating system distributions without committing to a permanent installation on the local hard drive. Many of the smaller Linux distributions can also be used from a USB flash drive.''&lt;br /&gt;
&lt;br /&gt;
Usually, all you need for this with an USB storage device (flash USB stick or external drive) is a partition, flagged &amp;quot;bootable&amp;quot; (see fdisk), containing a boot loader (say grub). But the problem is that specifications vary between motherboards, so there are variants and mandatory requirements to define (here would be a good idea), so that one can optimize/maximize the compatibility.&lt;br /&gt;
&lt;br /&gt;
==The perfect geek knife==&lt;br /&gt;
&lt;br /&gt;
We may want to start our own distro with the following constraints:&lt;br /&gt;
* Multiboot: small utilities/compilations + bull blown light OS&lt;br /&gt;
* Aiming at maximum hardware compatibility, possibly using liveCD technology (knoppix-based distros)&lt;br /&gt;
* Aiming at minimum resource+system footprint, and boot speed&lt;br /&gt;
* Being able to install software temporary (for the session) or permanently, upgradable&lt;br /&gt;
* Being able to use the phone features at the same time (access pim, data &amp;amp; calls)&lt;br /&gt;
&lt;br /&gt;
Optimally, being able to charge the device while plugged in would be great too.&lt;br /&gt;
&lt;br /&gt;
==About USB Booting==&lt;br /&gt;
&lt;br /&gt;
From [http://www.damnsmalllinux.org/wiki/index.php/USB_Booting DSL Wiki]:&lt;br /&gt;
&lt;br /&gt;
Older computer BIOS usually do not support direct booting from a USB device. Around 2001, PC motherboard manufacturers started to add USB boot support.&lt;br /&gt;
&lt;br /&gt;
There are two common BIOS methods for direct USB booting:&lt;br /&gt;
* One method is called the &amp;quot;USBHDD&amp;quot; method and it is used to support the booting of standard USB mass storage devices that are configured like a normal PC hard drive.&lt;br /&gt;
* The other method is called the &amp;quot;USBZIP&amp;quot; method and it supports booting from a USB storage device that behaves like the original IOMEGA ZIP drive with USB support. &lt;br /&gt;
&lt;br /&gt;
Most computers (just about all Dells, for example) made today have a BIOS that supports the USBHDD method so I expect that this will eventually become the standard way to boot a USB device. However, many motherboards will support BOTH methods, and many older motherboards have USBZIP support.&lt;br /&gt;
&lt;br /&gt;
Some newer BIOSs which support USB 2.0 will not boot from an older pen drive. Using a USB 2.0 compliant one usually solves this problem. Also, some older BIOSs which only support USB 1.1 will not boot from newer drives which support USB 2.0!&lt;br /&gt;
&lt;br /&gt;
Some USB keys don't boot. If this is the case, it may be possible to fix them by installing a new master boot record. (Most keys boot OK by default; some cannot be fixed even by doing this. However, it helps in some cases). Run the command:&lt;br /&gt;
&lt;br /&gt;
''WARNING! May break your primary hard drive if it's named sda'' &lt;br /&gt;
&lt;br /&gt;
lilo -M /dev/sda&lt;br /&gt;
&lt;br /&gt;
==USB Booting in Neo1973's kernel==&lt;br /&gt;
&lt;br /&gt;
Although there is very little information about it, the g_storage kernel module is responsible for the Neo's mass storage mode. The boot-or-not criteria might rely on this very module.&lt;br /&gt;
&lt;br /&gt;
==TODO==&lt;br /&gt;
&lt;br /&gt;
Testing/further research has to be conducted to determine:&lt;br /&gt;
* if a bootable-flagged partition / grub doesn't mess openmoko up&lt;br /&gt;
* if the phone can still act as a phone, or if the booted os can use the gprs functions&lt;br /&gt;
* if the phone can recharge on mass storage mode (from the usb cable)&lt;br /&gt;
* if a dedicated partition for each payload is needed (see memtest example...)&lt;br /&gt;
* if multi-boot is possible: grub?&lt;br /&gt;
&lt;br /&gt;
==Linux distro Howto's: liveUSB creation==&lt;br /&gt;
&lt;br /&gt;
In short:&lt;br /&gt;
#Mount USB drive, with e.g. mount /dev/sda1 /flash - can be either FAT16 or FAT32!&lt;br /&gt;
#Mount ISO image, with e.g. mount /tmp/dsl-3.2.iso /tmp/iso -o loop&lt;br /&gt;
#Copy all contents from ISO to USB drive: cp -vr /tmp/iso/* /flash/&lt;br /&gt;
#Rename and move syslinux files to root directory: mv /flash/boot/isolinux/* /flash/&lt;br /&gt;
#Rename isolinux.cfg: mv /flash/isolinux.cfg /flash/syslinux.cfg&lt;br /&gt;
#Unmount USB drive: umount /flash&lt;br /&gt;
#Install syslinux: syslinux /dev/sda1 and eventually set the MBR boot flag for this partition (with fdisk). &lt;br /&gt;
&lt;br /&gt;
*Fedora Core's [http://revisor.fedoraunity.org Revisor] enables easy GUI-driven ISO customization, allowing to choose the output medium (CD/DVD/USB)&lt;br /&gt;
*[http://www.damnsmalllinux.org/wiki/index.php/Installing_to_a_USB_Flash_Drive Installing DSL to USB device - using grub]&lt;br /&gt;
*[http://wiki.debian.org/BootUsb Debian BootUSB - using Lilo]&lt;br /&gt;
*[http://www.debuntu.org/how-to-install-ubuntu-linux-on-usb-bar Howto install ubuntu (or any other distro) on usb stick]&lt;br /&gt;
*[http://www.gentoo.org/doc/en/liveusb.xml Gentoo on usb stick]&lt;br /&gt;
*[http://pendrivelinux.com/ Windows &amp;amp; Linux tutorials &amp;amp; resources]:     &lt;br /&gt;
    * Flash installation via Windows: XUbuntu, DSL, Knoppix, Slax, MiniMe&lt;br /&gt;
    * Flash installation via Linux: Ubuntu Edgy, Knoppix, PCLinuxOS&lt;br /&gt;
&lt;br /&gt;
'''Transflash partitioning schema example'''&lt;br /&gt;
&lt;br /&gt;
* 2 Gb: /dev/sd? (where N is the transflash's number)&lt;br /&gt;
* 700 Mb: /dev/sd?1 : containing bootable iso, FAT16&lt;br /&gt;
* 1300 Mb: /dev/sd?2 : openmoko &amp;amp; bootable os home partition, EXT3?&lt;br /&gt;
* + eventually a swap&lt;br /&gt;
&lt;br /&gt;
The limitation of this method is that the booted OS is static (not-self modifiable). There's the option to install linux using the partition, but it's not really mobility-oriented (liveCDs are optimized for maximum autoconfiguration).&lt;br /&gt;
&lt;br /&gt;
==Alternative methods==&lt;br /&gt;
&lt;br /&gt;
===Booting ISOs ?===&lt;br /&gt;
&lt;br /&gt;
* Grub? From [http://www.freesoftwaremagazine.com/articles/grub_intro#comment-12900 How to install grub on an usb pendrive]:&lt;br /&gt;
    If you want to boot from a iso file on a harddisk, do something in menu.lst like&lt;br /&gt;
    title Boot from iso on a harddisk&lt;br /&gt;
    map (hdX,Y)/your.iso (hdZ)&lt;br /&gt;
    map --rehook&lt;br /&gt;
    chainloader (hdZ)+1&lt;br /&gt;
    rootnoverify (hdZ)&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
Grub &amp;amp; memdisk can boot floppy images, but (AFAIK) not isos. Example from the stock /boot/grub/menu.lst ubuntu:&lt;br /&gt;
    title           Ubuntu, memtest86+&lt;br /&gt;
    root            (hd0,2)&lt;br /&gt;
    kernel          /memtest86+.bin&lt;br /&gt;
    quiet&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
''Using the memdisk kernel from the syslinux package, you can load disk images and execute them in a non-emulated environment.''&lt;br /&gt;
&lt;br /&gt;
* [http://www.knoppix.net/wiki/Cheat_Codes knoppix '''bootfrom''' cheatcode]&lt;br /&gt;
&lt;br /&gt;
    bootfrom=/dev/hda1/KNX.iso &lt;br /&gt;
&lt;br /&gt;
Bootfrom needs access to a running Knoppix-System '''with the same Kernel as the Bootkernel''', before it is able to mount the partition / ISO-Image.  &lt;br /&gt;
&lt;br /&gt;
* Maybe there's a way to achieve a boot cd iso selecter see ([http://www.linuxquestions.org/questions/showthread.php?t=528840 this post])&lt;br /&gt;
* virtualization-oriented distro... ex [http://unit.aist.go.jp/itri/knoppix/xen/index-en.html Xenoppix] Cons: would work best only on modern VT-capable computers. What about a very minimal distribution (say DSL without X) kqemu-enblaed, booting into an ncurses iso-loader? The delicate part would be on the networking side.&lt;br /&gt;
&lt;br /&gt;
===Zero-Install / Networked systems===&lt;br /&gt;
&lt;br /&gt;
*[http://klik.atekon.de/wiki/index.php/Main_Page Klik] with more than 1000 packages ported. See [http://klik.atekon.de/wiki/index.php/Comparison comparison chart].&lt;br /&gt;
*[http://0install.net/index.html The Zero Install System], with automatic dependancies, upgrading. See [http://0install.net/matrix.html] comparison chart.&lt;br /&gt;
*Why not rolling a [http://wiki.rpath.com/wiki/Conary:Concepts Conary/RPath-based] distro, based on [http://www.rpath.com/rbuilder/project/rpath/ rPath linux] reference distribution ? Or choose within the available ones...&lt;br /&gt;
* The FUSE [http://httpfs.sourceforge.net/net_boot.htm httpfs] may allow pure http net booting, downloading files from a distant livecd only when needed (this image may be very minimal though).&lt;br /&gt;
* [http://developer.amazonwebservices.com/connect/thread.jspa?threadID=10271&amp;amp;start=75&amp;amp;tstart=0 some people] hare thinking of using Amazon S3 as virtual disk&lt;br /&gt;
&lt;br /&gt;
===Using Qemu to boot Linux from a flash drive within Windows===&lt;br /&gt;
&lt;br /&gt;
The following tutorial explains how to use Qemu to boot Linux from a portable USB flash device while still working within Windows. This Enables the user to have both systems running at the same time eliminating the need to restart the PC and set your BIOS options to boot Linux.&lt;br /&gt;
&lt;br /&gt;
[http://www.pendrivelinux.com/2007/03/09/use-qemu-to-boot-linux-from-windows/ PendriveLinux article]&lt;br /&gt;
&lt;br /&gt;
===Putting a vnc server on openmoko===&lt;br /&gt;
&lt;br /&gt;
That's another alternative :)&lt;br /&gt;
&lt;br /&gt;
===The BlackDog project===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;When plugged into the host computer’s USB port, BlackDog starts up, '''automatically launching the X Window system for Windows Xming and a software NAT router via an autorun application that the BlackDog presents to the host through a virtual USB CD-ROM. Once those applications are running, the virtual USB CD-ROM drive disconnects, and a virtual USB-to-Ethernet adapter is connected to provide the communications link.'''&lt;br /&gt;
&lt;br /&gt;
The host machine’s monitor, keyboard, mouse, and Internet connection are used by the BlackDog for the duration of the session.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The [http://en.wikipedia.org/wiki/BlackDog BlackDog server] project has lots of interesting concepts (and software). Could [http://www.jasonkolb.com/weblog/2006/11/idea_7_personal.html personal servers] change the face of computing ? Together with biometry, ''they open up the possibility of carrying your personal server, or an extension of it, with you on your physical person. The reason this is so exciting is because it enables biometric authentication that doesn't require shipping your biometric data to a third party'.&lt;br /&gt;
&lt;br /&gt;
==Interesting distros/payloads==&lt;br /&gt;
&lt;br /&gt;
'''System diagnostics / recovery'''&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Memtest Memtest86+] Very small&lt;br /&gt;
*[http://www.ultimatebootcd.com/ The Ultimate Boot CD]&lt;br /&gt;
*[http://www.sysresccd.org/Main_Page System Rescue CD]&lt;br /&gt;
*[http://www.tux.org/pub/people/kent-robotti/looplinux/rip/ Recovery IS Possible] &amp;lt; 80 MB&lt;br /&gt;
&lt;br /&gt;
'''General purpose'''&lt;br /&gt;
*[http://jinx-linux.sourceforge.net/ jinx-linux] &amp;lt; 50 MB&lt;br /&gt;
*[http://knoppix.com/ Knoppix] 700 MB CD-ROM&lt;br /&gt;
*[http://www.puppylinux.org PuppyLinux] &amp;lt; 100 MB&lt;br /&gt;
*[http://www.damnsmalllinux.org DSL] ~50 MB&lt;br /&gt;
*[http://gentoo-wiki.com/TinyGentoo#What_is_this_.3F TinyGentoo] 5 MB&lt;br /&gt;
&lt;br /&gt;
'''Security-oriented''': pentesting, forensics, anonymous webbrowsing&lt;br /&gt;
*[http://www.darknet.org.uk/2006/03/10-best-security-live-cd-distros-pen-test-forensics-recovery/ List of Security distros]&lt;br /&gt;
*[http://www.remote-exploit.org/backtrack.html Backtrack Livecd]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Anonym.OS Anonym.OS: browse the web anonymously]&lt;br /&gt;
*[http://dban.sourceforge.net/ Darik's Boot and Nuke]: ''dangerous''&lt;br /&gt;
*[http://byzgl.sourceforge.net/wiki/index.php/Main_Page Byzantine OS] is a webkiosk appliance (32/48 MB)&lt;br /&gt;
&lt;br /&gt;
The SabayonLinux distro offers a lot of [http://www.sabayonlinux.org/wiki/index.php?title=Sabayon_Linux#Boot_Methods_for_special_ways_of_using_Sabayon boot cheatcodes], such as booting onto GeexBox. We should take a look at the method used.&lt;br /&gt;
&lt;br /&gt;
'''[http://www.livecdlist.com/ List of live distros @ livecdlist.com]''' ''Includes sizes''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/List_of_LiveDistros List of live distros @ wikipedia]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://distrowatch.com/dwres.php?resource=cd List of live distros @ distrowatch]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB article]'''&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro</id>
		<title>Wishlist/LiveUSB distro</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro"/>
				<updated>2007-08-25T00:39:28Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: Typo fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{wishlist}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
NOTE: this page may be renamed: portable destkop&lt;br /&gt;
&lt;br /&gt;
An openmoko device could act as '''the perfect geeky swiss knive''': go anywhere with your Linux desktop and tools.&lt;br /&gt;
&lt;br /&gt;
YES, there are tons of liveCDs out there, but CDs/DVDs:&lt;br /&gt;
* get easily damaged&lt;br /&gt;
* don't fit in a pocket (except for businesscard-sized ones ; too exotic...)&lt;br /&gt;
* don't update or save settings/personal data without a supplementary USB device&lt;br /&gt;
&lt;br /&gt;
YES, there are LiveUSB distros but:&lt;br /&gt;
* a Neo/OpenMoko device IS sort of an USB stick; one object is better than two&lt;br /&gt;
* you may carry my cellphone everywhere, what about usb sticks or cds ?&lt;br /&gt;
&lt;br /&gt;
The biggest argument against these ones is that you'd have to carry an USB cable with you... But it's a standard one, which is good news :) An integrated zippable plug could be an interesting add-on...&lt;br /&gt;
&lt;br /&gt;
Similar functionality can be found in [http://en.wikipedia.org/wiki/Wizpy the Wizpy portable media player], but relies on different methods for working under Windows (cd-rom emulation).&lt;br /&gt;
&lt;br /&gt;
When the openmoko device is in mass storage mode, a host computer should be able to boot on it, presenting a grub menu offering to boot into several images / partitions (payloads) on the transflash: memtest, UBCD (the ultimate boot cd), a lightweight security oriented livecd distro, you name it... &lt;br /&gt;
&lt;br /&gt;
It's sometimes called Live USB: from [http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB definition], ''A live USB is a USB flash drive containing a full operating system which can be booted from. Live USBs are closely related to Live CDs, and are sometimes used interchangeably. Like Live CDs, Live USBs can be used for system administration, data recovery, or the testing of operating system distributions without committing to a permanent installation on the local hard drive. Many of the smaller Linux distributions can also be used from a USB flash drive.''&lt;br /&gt;
&lt;br /&gt;
Usually, all you need for this with an USB storage device (flash USB stick or external drive) is a partition, flagged &amp;quot;bootable&amp;quot; (see fdisk), containing a boot loader (say grub). But the problem is that specifications vary between motherboards, so there are variants and mandatory requirements to define (here would be a good idea), so that one can optimize/maximize the compatibility.&lt;br /&gt;
&lt;br /&gt;
==The perfect geek knife==&lt;br /&gt;
&lt;br /&gt;
We may want to start our own distro with the following constraints:&lt;br /&gt;
* Multiboot: small utilities/compilations + bull blown light OS&lt;br /&gt;
* Aiming at maximum hardware compatibility, possibly using liveCD technology (knoppix-based distros)&lt;br /&gt;
* Aiming at minimum resource+system footprint, and boot speed&lt;br /&gt;
* Being able to install software temporary (for the session) or permanently, upgradable&lt;br /&gt;
* Being able to use the phone features at the same time (access pim, data &amp;amp; calls)&lt;br /&gt;
&lt;br /&gt;
Optimally, being able to charge the device while plugged in would be great too.&lt;br /&gt;
&lt;br /&gt;
==About USB Booting==&lt;br /&gt;
&lt;br /&gt;
From [http://www.damnsmalllinux.org/wiki/index.php/USB_Booting DSL Wiki]:&lt;br /&gt;
&lt;br /&gt;
Older computer BIOS usually do not support direct booting from a USB device. Around 2001, PC motherboard manufacturers started to add USB boot support.&lt;br /&gt;
&lt;br /&gt;
There are two common BIOS methods for direct USB booting:&lt;br /&gt;
* One method is called the &amp;quot;USBHDD&amp;quot; method and it is used to support the booting of standard USB mass storage devices that are configured like a normal PC hard drive.&lt;br /&gt;
* The other method is called the &amp;quot;USBZIP&amp;quot; method and it supports booting from a USB storage device that behaves like the original IOMEGA ZIP drive with USB support. &lt;br /&gt;
&lt;br /&gt;
Most computers (just about all Dells, for example) made today have a BIOS that supports the USBHDD method so I expect that this will eventually become the standard way to boot a USB device. However, many motherboards will support BOTH methods, and many older motherboards have USBZIP support.&lt;br /&gt;
&lt;br /&gt;
Some newer BIOSs which support USB 2.0 will not boot from an older pen drive. Using a USB 2.0 compliant one usually solves this problem. Also, some older BIOSs which only support USB 1.1 will not boot from newer drives which support USB 2.0!&lt;br /&gt;
&lt;br /&gt;
Some USB keys don't boot. If this is the case, it may be possible to fix them by installing a new master boot record. (Most keys boot OK by default; some cannot be fixed even by doing this. However, it helps in some cases). Run the command:&lt;br /&gt;
&lt;br /&gt;
''WARNING! May break your primary hard drive if it's named sda'' &lt;br /&gt;
&lt;br /&gt;
lilo -M /dev/sda&lt;br /&gt;
&lt;br /&gt;
==USB Booting in Neo1973's kernel==&lt;br /&gt;
&lt;br /&gt;
Although there is very little information about it, the g_storage kernel module is responsible for the Neo's mass storage mode. So the boot-or-not criteria might rely on this very module.&lt;br /&gt;
&lt;br /&gt;
==TODO==&lt;br /&gt;
&lt;br /&gt;
Testing/further research has to be conducted to determine:&lt;br /&gt;
* if a bootable-flagged partition / grub doesn't mess openmoko up&lt;br /&gt;
* if the phone can still act as a phone, or if the booted os can use the gprs functions&lt;br /&gt;
* if the phone can recharge on mass storage mode (from the usb cable)&lt;br /&gt;
* if a dedicated partition for each payload is needed (see memtest example...)&lt;br /&gt;
* if multi-boot is possible: grub?&lt;br /&gt;
&lt;br /&gt;
==Linux distro Howto's: liveUSB creation==&lt;br /&gt;
&lt;br /&gt;
In short:&lt;br /&gt;
#Mount USB drive, with e.g. mount /dev/sda1 /flash - can be either FAT16 or FAT32!&lt;br /&gt;
#Mount ISO image, with e.g. mount /tmp/dsl-3.2.iso /tmp/iso -o loop&lt;br /&gt;
#Copy all contents from ISO to USB drive: cp -vr /tmp/iso/* /flash/&lt;br /&gt;
#Rename and move syslinux files to root directory: mv /flash/boot/isolinux/* /flash/&lt;br /&gt;
#Rename isolinux.cfg: mv /flash/isolinux.cfg /flash/syslinux.cfg&lt;br /&gt;
#Unmount USB drive: umount /flash&lt;br /&gt;
#Install syslinux: syslinux /dev/sda1 and eventually set the MBR boot flag for this partition (with fdisk). &lt;br /&gt;
&lt;br /&gt;
*Fedora Core's [http://revisor.fedoraunity.org Revisor] enables easy GUI-driven ISO customization, allowing to choose the output medium (CD/DVD/USB)&lt;br /&gt;
*[http://www.damnsmalllinux.org/wiki/index.php/Installing_to_a_USB_Flash_Drive Installing DSL to USB device - using grub]&lt;br /&gt;
*[http://wiki.debian.org/BootUsb Debian BootUSB - using Lilo]&lt;br /&gt;
*[http://www.debuntu.org/how-to-install-ubuntu-linux-on-usb-bar Howto install ubuntu (or any other distro) on usb stick]&lt;br /&gt;
*[http://www.gentoo.org/doc/en/liveusb.xml Gentoo on usb stick]&lt;br /&gt;
*[http://pendrivelinux.com/ Windows &amp;amp; Linux tutorials &amp;amp; resources]:     &lt;br /&gt;
    * Flash installation via Windows: XUbuntu, DSL, Knoppix, Slax, MiniMe&lt;br /&gt;
    * Flash installation via Linux: Ubuntu Edgy, Knoppix, PCLinuxOS&lt;br /&gt;
&lt;br /&gt;
'''Transflash partitioning schema example'''&lt;br /&gt;
&lt;br /&gt;
* 2 Gb: /dev/sd? (where N is the transflash's number)&lt;br /&gt;
* 700 Mb: /dev/sd?1 : containing bootable iso, FAT16&lt;br /&gt;
* 1300 Mb: /dev/sd?2 : openmoko &amp;amp; bootable os home partition, EXT3?&lt;br /&gt;
* + eventually a swap&lt;br /&gt;
&lt;br /&gt;
The limitation of this method is that the booted OS is static (not-self modifiable). There's the option to install linux using the partition, but it's not really mobility-oriented (liveCDs are optimized for maximum autoconfiguration).&lt;br /&gt;
&lt;br /&gt;
==Alternative methods==&lt;br /&gt;
&lt;br /&gt;
===Booting ISOs ?===&lt;br /&gt;
&lt;br /&gt;
* Grub? From [http://www.freesoftwaremagazine.com/articles/grub_intro#comment-12900 How to install grub on an usb pendrive]:&lt;br /&gt;
    If you want to boot from a iso file on a harddisk, do something in menu.lst like&lt;br /&gt;
    title Boot from iso on a harddisk&lt;br /&gt;
    map (hdX,Y)/your.iso (hdZ)&lt;br /&gt;
    map --rehook&lt;br /&gt;
    chainloader (hdZ)+1&lt;br /&gt;
    rootnoverify (hdZ)&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
Grub &amp;amp; memdisk can boot floppy images, but (AFAIK) not isos. Example from the stock /boot/grub/menu.lst ubuntu:&lt;br /&gt;
    title           Ubuntu, memtest86+&lt;br /&gt;
    root            (hd0,2)&lt;br /&gt;
    kernel          /memtest86+.bin&lt;br /&gt;
    quiet&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
''Using the memdisk kernel from the syslinux package, you can load disk images and execute them in a non-emulated environment.''&lt;br /&gt;
&lt;br /&gt;
* [http://www.knoppix.net/wiki/Cheat_Codes knoppix '''bootfrom''' cheatcode]&lt;br /&gt;
&lt;br /&gt;
    bootfrom=/dev/hda1/KNX.iso &lt;br /&gt;
&lt;br /&gt;
Bootfrom needs access to a running Knoppix-System '''with the same Kernel as the Bootkernel''', before it is able to mount the partition / ISO-Image.  &lt;br /&gt;
&lt;br /&gt;
* Maybe there's a way to achieve a boot cd iso selecter see ([http://www.linuxquestions.org/questions/showthread.php?t=528840 this post])&lt;br /&gt;
* virtualization-oriented distro... ex [http://unit.aist.go.jp/itri/knoppix/xen/index-en.html Xenoppix] Cons: would work best only on modern VT-capable computers. What about a very minimal distribution (say DSL without X) kqemu-enblaed, booting into an ncurses iso-loader? The delicate part would be on the networking side.&lt;br /&gt;
&lt;br /&gt;
===Zero-Install / Networked systems===&lt;br /&gt;
&lt;br /&gt;
*[http://klik.atekon.de/wiki/index.php/Main_Page Klik] with more than 1000 packages ported. See [http://klik.atekon.de/wiki/index.php/Comparison comparison chart].&lt;br /&gt;
*[http://0install.net/index.html The Zero Install System], with automatic dependancies, upgrading. See [http://0install.net/matrix.html] comparison chart.&lt;br /&gt;
*Why not rolling a [http://wiki.rpath.com/wiki/Conary:Concepts Conary/RPath-based] distro, based on [http://www.rpath.com/rbuilder/project/rpath/ rPath linux] reference distribution ? Or choose within the available ones...&lt;br /&gt;
* The FUSE [http://httpfs.sourceforge.net/net_boot.htm httpfs] may allow pure http net booting, downloading files from a distant livecd only when needed (this image may be very minimal though).&lt;br /&gt;
* [http://developer.amazonwebservices.com/connect/thread.jspa?threadID=10271&amp;amp;start=75&amp;amp;tstart=0 some people] hare thinking of using Amazon S3 as virtual disk&lt;br /&gt;
&lt;br /&gt;
===Using Qemu to boot Linux from a flash drive within Windows===&lt;br /&gt;
&lt;br /&gt;
The following tutorial explains how to use Qemu to boot Linux from a portable USB flash device while still working within Windows. This Enables the user to have both systems running at the same time eliminating the need to restart the PC and set your BIOS options to boot Linux.&lt;br /&gt;
&lt;br /&gt;
[http://www.pendrivelinux.com/2007/03/09/use-qemu-to-boot-linux-from-windows/ PendriveLinux article]&lt;br /&gt;
&lt;br /&gt;
===Putting a vnc server on openmoko===&lt;br /&gt;
&lt;br /&gt;
That's another alternative :)&lt;br /&gt;
&lt;br /&gt;
===The BlackDog project===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;When plugged into the host computer’s USB port, BlackDog starts up, '''automatically launching the X Window system for Windows Xming and a software NAT router via an autorun application that the BlackDog presents to the host through a virtual USB CD-ROM. Once those applications are running, the virtual USB CD-ROM drive disconnects, and a virtual USB-to-Ethernet adapter is connected to provide the communications link.'''&lt;br /&gt;
&lt;br /&gt;
The host machine’s monitor, keyboard, mouse, and Internet connection are used by the BlackDog for the duration of the session.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The [http://en.wikipedia.org/wiki/BlackDog BlackDog server] project has lots of interesting concepts (and software). Could [http://www.jasonkolb.com/weblog/2006/11/idea_7_personal.html personal servers] change the face of computing ? Together with biometry, ''they open up the possibility of carrying your personal server, or an extension of it, with you on your physical person. The reason this is so exciting is because it enables biometric authentication that doesn't require shipping your biometric data to a third party'.&lt;br /&gt;
&lt;br /&gt;
==Interesting distros/payloads==&lt;br /&gt;
&lt;br /&gt;
'''System diagnostics / recovery'''&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Memtest Memtest86+] Very small&lt;br /&gt;
*[http://www.ultimatebootcd.com/ The Ultimate Boot CD]&lt;br /&gt;
*[http://www.sysresccd.org/Main_Page System Rescue CD]&lt;br /&gt;
*[http://www.tux.org/pub/people/kent-robotti/looplinux/rip/ Recovery IS Possible] &amp;lt; 80 MB&lt;br /&gt;
&lt;br /&gt;
'''General purpose'''&lt;br /&gt;
*[http://jinx-linux.sourceforge.net/ jinx-linux] &amp;lt; 50 MB&lt;br /&gt;
*[http://knoppix.com/ Knoppix] 700 MB CD-ROM&lt;br /&gt;
*[http://www.puppylinux.org PuppyLinux] &amp;lt; 100 MB&lt;br /&gt;
*[http://www.damnsmalllinux.org DSL] ~50 MB&lt;br /&gt;
*[http://gentoo-wiki.com/TinyGentoo#What_is_this_.3F TinyGentoo] 5 MB&lt;br /&gt;
&lt;br /&gt;
'''Security-oriented''': pentesting, forensics, anonymous webbrowsing&lt;br /&gt;
*[http://www.darknet.org.uk/2006/03/10-best-security-live-cd-distros-pen-test-forensics-recovery/ List of Security distros]&lt;br /&gt;
*[http://www.remote-exploit.org/backtrack.html Backtrack Livecd]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Anonym.OS Anonym.OS: browse the web anonymously]&lt;br /&gt;
*[http://dban.sourceforge.net/ Darik's Boot and Nuke]: ''dangerous''&lt;br /&gt;
*[http://byzgl.sourceforge.net/wiki/index.php/Main_Page Byzantine OS] is a webkiosk appliance (32/48 MB)&lt;br /&gt;
&lt;br /&gt;
The SabayonLinux distro offers a lot of [http://www.sabayonlinux.org/wiki/index.php?title=Sabayon_Linux#Boot_Methods_for_special_ways_of_using_Sabayon boot cheatcodes], such as booting onto GeexBox. We should take a look at the method used.&lt;br /&gt;
&lt;br /&gt;
'''[http://www.livecdlist.com/ List of live distros @ livecdlist.com]''' ''Includes sizes''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/List_of_LiveDistros List of live distros @ wikipedia]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://distrowatch.com/dwres.php?resource=cd List of live distros @ distrowatch]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB article]'''&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro</id>
		<title>Wishlist/LiveUSB distro</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro"/>
				<updated>2007-08-25T00:39:06Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: Added warning&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{wishlist}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
NOTE: this page may be renamed: portable destkop&lt;br /&gt;
&lt;br /&gt;
An openmoko device could act as '''the perfect geeky swiss knive''': go anywhere with your Linux desktop and tools.&lt;br /&gt;
&lt;br /&gt;
YES, there are tons of liveCDs out there, but CDs/DVDs:&lt;br /&gt;
* get easily damaged&lt;br /&gt;
* don't fit in a pocket (except for businesscard-sized ones ; too exotic...)&lt;br /&gt;
* don't update or save settings/personal data without a supplementary USB device&lt;br /&gt;
&lt;br /&gt;
YES, there are LiveUSB distros but:&lt;br /&gt;
* a Neo/OpenMoko device IS sort of an USB stick; one object is better than two&lt;br /&gt;
* you may carry my cellphone everywhere, what about usb sticks or cds ?&lt;br /&gt;
&lt;br /&gt;
The biggest argument against these ones is that you'd have to carry an USB cable with you... But it's a standard one, which is good news :) An integrated zippable plug could be an interesting add-on...&lt;br /&gt;
&lt;br /&gt;
Similar functionality can be found in [http://en.wikipedia.org/wiki/Wizpy the Wizpy portable media player], but relies on different methods for working under Windows (cd-rom emulation).&lt;br /&gt;
&lt;br /&gt;
When the openmoko device is in mass storage mode, a host computer should be able to boot on it, presenting a grub menu offering to boot into several images / partitions (payloads) on the transflash: memtest, UBCD (the ultimate boot cd), a lightweight security oriented livecd distro, you name it... &lt;br /&gt;
&lt;br /&gt;
It's sometimes called Live USB: from [http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB definition], ''A live USB is a USB flash drive containing a full operating system which can be booted from. Live USBs are closely related to Live CDs, and are sometimes used interchangeably. Like Live CDs, Live USBs can be used for system administration, data recovery, or the testing of operating system distributions without committing to a permanent installation on the local hard drive. Many of the smaller Linux distributions can also be used from a USB flash drive.''&lt;br /&gt;
&lt;br /&gt;
Usually, all you need for this with an USB storage device (flash USB stick or external drive) is a partition, flagged &amp;quot;bootable&amp;quot; (see fdisk), containing a boot loader (say grub). But the problem is that specifications vary between motherboards, so there are variants and mandatory requirements to define (here would be a good idea), so that one can optimize/maximize the compatibility.&lt;br /&gt;
&lt;br /&gt;
==The perfect geek knife==&lt;br /&gt;
&lt;br /&gt;
We may want to start our own distro with the following constraints:&lt;br /&gt;
* Multiboot: small utilities/compilations + bull blown light OS&lt;br /&gt;
* Aiming at maximum hardware compatibility, possibly using liveCD technology (knoppix-based distros)&lt;br /&gt;
* Aiming at minimum resource+system footprint, and boot speed&lt;br /&gt;
* Being able to install software temporary (for the session) or permanently, upgradable&lt;br /&gt;
* Being able to use the phone features at the same time (access pim, data &amp;amp; calls)&lt;br /&gt;
&lt;br /&gt;
Optimally, being able to charge the device while plugged in would be great too.&lt;br /&gt;
&lt;br /&gt;
==About USB Booting==&lt;br /&gt;
&lt;br /&gt;
From [http://www.damnsmalllinux.org/wiki/index.php/USB_Booting DSL Wiki]:&lt;br /&gt;
&lt;br /&gt;
Older computer BIOS usually do not support direct booting from a USB device. Around 2001, PC motherboard manufacturers started to add USB boot support.&lt;br /&gt;
&lt;br /&gt;
There are two common BIOS methods for direct USB booting:&lt;br /&gt;
* One method is called the &amp;quot;USBHDD&amp;quot; method and it is used to support the booting of standard USB mass storage devices that are configured like a normal PC hard drive.&lt;br /&gt;
* The other method is called the &amp;quot;USBZIP&amp;quot; method and it supports booting from a USB storage device that behaves like the original IOMEGA ZIP drive with USB support. &lt;br /&gt;
&lt;br /&gt;
Most computers (just about all Dells, for example) made today have a BIOS that supports the USBHDD method so I expect that this will eventually become the standard way to boot a USB device. However, many motherboards will support BOTH methods, and many older motherboards have USBZIP support.&lt;br /&gt;
&lt;br /&gt;
Some newer BIOSs which support USB 2.0 will not boot from an older pen drive. Using a USB 2.0 compliant one usually solves this problem. Also, some older BIOSs which only support USB 1.1 will not boot from newer drives which support USB 2.0!&lt;br /&gt;
&lt;br /&gt;
Some USB keys don't boot. If this is the case, it may be possible to fix them by installing a new master boot record. (Most keys boot OK by default; some cannot be fixed even by doing this. However, it helps in some cases). Run the command:&lt;br /&gt;
&lt;br /&gt;
''WARNING! May break your primary hard drive if it's named sda'' lilo -M /dev/sda&lt;br /&gt;
&lt;br /&gt;
==USB Booting in Neo1973's kernel==&lt;br /&gt;
&lt;br /&gt;
Although there is very little information about it, the g_storage kernel module is responsible for the Neo's mass storage mode. So the boot-or-not criteria might rely on this very module.&lt;br /&gt;
&lt;br /&gt;
==TODO==&lt;br /&gt;
&lt;br /&gt;
Testing/further research has to be conducted to determine:&lt;br /&gt;
* if a bootable-flagged partition / grub doesn't mess openmoko up&lt;br /&gt;
* if the phone can still act as a phone, or if the booted os can use the gprs functions&lt;br /&gt;
* if the phone can recharge on mass storage mode (from the usb cable)&lt;br /&gt;
* if a dedicated partition for each payload is needed (see memtest example...)&lt;br /&gt;
* if multi-boot is possible: grub?&lt;br /&gt;
&lt;br /&gt;
==Linux distro Howto's: liveUSB creation==&lt;br /&gt;
&lt;br /&gt;
In short:&lt;br /&gt;
#Mount USB drive, with e.g. mount /dev/sda1 /flash - can be either FAT16 or FAT32!&lt;br /&gt;
#Mount ISO image, with e.g. mount /tmp/dsl-3.2.iso /tmp/iso -o loop&lt;br /&gt;
#Copy all contents from ISO to USB drive: cp -vr /tmp/iso/* /flash/&lt;br /&gt;
#Rename and move syslinux files to root directory: mv /flash/boot/isolinux/* /flash/&lt;br /&gt;
#Rename isolinux.cfg: mv /flash/isolinux.cfg /flash/syslinux.cfg&lt;br /&gt;
#Unmount USB drive: umount /flash&lt;br /&gt;
#Install syslinux: syslinux /dev/sda1 and eventually set the MBR boot flag for this partition (with fdisk). &lt;br /&gt;
&lt;br /&gt;
*Fedora Core's [http://revisor.fedoraunity.org Revisor] enables easy GUI-driven ISO customization, allowing to choose the output medium (CD/DVD/USB)&lt;br /&gt;
*[http://www.damnsmalllinux.org/wiki/index.php/Installing_to_a_USB_Flash_Drive Installing DSL to USB device - using grub]&lt;br /&gt;
*[http://wiki.debian.org/BootUsb Debian BootUSB - using Lilo]&lt;br /&gt;
*[http://www.debuntu.org/how-to-install-ubuntu-linux-on-usb-bar Howto install ubuntu (or any other distro) on usb stick]&lt;br /&gt;
*[http://www.gentoo.org/doc/en/liveusb.xml Gentoo on usb stick]&lt;br /&gt;
*[http://pendrivelinux.com/ Windows &amp;amp; Linux tutorials &amp;amp; resources]:     &lt;br /&gt;
    * Flash installation via Windows: XUbuntu, DSL, Knoppix, Slax, MiniMe&lt;br /&gt;
    * Flash installation via Linux: Ubuntu Edgy, Knoppix, PCLinuxOS&lt;br /&gt;
&lt;br /&gt;
'''Transflash partitioning schema example'''&lt;br /&gt;
&lt;br /&gt;
* 2 Gb: /dev/sd? (where N is the transflash's number)&lt;br /&gt;
* 700 Mb: /dev/sd?1 : containing bootable iso, FAT16&lt;br /&gt;
* 1300 Mb: /dev/sd?2 : openmoko &amp;amp; bootable os home partition, EXT3?&lt;br /&gt;
* + eventually a swap&lt;br /&gt;
&lt;br /&gt;
The limitation of this method is that the booted OS is static (not-self modifiable). There's the option to install linux using the partition, but it's not really mobility-oriented (liveCDs are optimized for maximum autoconfiguration).&lt;br /&gt;
&lt;br /&gt;
==Alternative methods==&lt;br /&gt;
&lt;br /&gt;
===Booting ISOs ?===&lt;br /&gt;
&lt;br /&gt;
* Grub? From [http://www.freesoftwaremagazine.com/articles/grub_intro#comment-12900 How to install grub on an usb pendrive]:&lt;br /&gt;
    If you want to boot from a iso file on a harddisk, do something in menu.lst like&lt;br /&gt;
    title Boot from iso on a harddisk&lt;br /&gt;
    map (hdX,Y)/your.iso (hdZ)&lt;br /&gt;
    map --rehook&lt;br /&gt;
    chainloader (hdZ)+1&lt;br /&gt;
    rootnoverify (hdZ)&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
Grub &amp;amp; memdisk can boot floppy images, but (AFAIK) not isos. Example from the stock /boot/grub/menu.lst ubuntu:&lt;br /&gt;
    title           Ubuntu, memtest86+&lt;br /&gt;
    root            (hd0,2)&lt;br /&gt;
    kernel          /memtest86+.bin&lt;br /&gt;
    quiet&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
''Using the memdisk kernel from the syslinux package, you can load disk images and execute them in a non-emulated environment.''&lt;br /&gt;
&lt;br /&gt;
* [http://www.knoppix.net/wiki/Cheat_Codes knoppix '''bootfrom''' cheatcode]&lt;br /&gt;
&lt;br /&gt;
    bootfrom=/dev/hda1/KNX.iso &lt;br /&gt;
&lt;br /&gt;
Bootfrom needs access to a running Knoppix-System '''with the same Kernel as the Bootkernel''', before it is able to mount the partition / ISO-Image.  &lt;br /&gt;
&lt;br /&gt;
* Maybe there's a way to achieve a boot cd iso selecter see ([http://www.linuxquestions.org/questions/showthread.php?t=528840 this post])&lt;br /&gt;
* virtualization-oriented distro... ex [http://unit.aist.go.jp/itri/knoppix/xen/index-en.html Xenoppix] Cons: would work best only on modern VT-capable computers. What about a very minimal distribution (say DSL without X) kqemu-enblaed, booting into an ncurses iso-loader? The delicate part would be on the networking side.&lt;br /&gt;
&lt;br /&gt;
===Zero-Install / Networked systems===&lt;br /&gt;
&lt;br /&gt;
*[http://klik.atekon.de/wiki/index.php/Main_Page Klik] with more than 1000 packages ported. See [http://klik.atekon.de/wiki/index.php/Comparison comparison chart].&lt;br /&gt;
*[http://0install.net/index.html The Zero Install System], with automatic dependancies, upgrading. See [http://0install.net/matrix.html] comparison chart.&lt;br /&gt;
*Why not rolling a [http://wiki.rpath.com/wiki/Conary:Concepts Conary/RPath-based] distro, based on [http://www.rpath.com/rbuilder/project/rpath/ rPath linux] reference distribution ? Or choose within the available ones...&lt;br /&gt;
* The FUSE [http://httpfs.sourceforge.net/net_boot.htm httpfs] may allow pure http net booting, downloading files from a distant livecd only when needed (this image may be very minimal though).&lt;br /&gt;
* [http://developer.amazonwebservices.com/connect/thread.jspa?threadID=10271&amp;amp;start=75&amp;amp;tstart=0 some people] hare thinking of using Amazon S3 as virtual disk&lt;br /&gt;
&lt;br /&gt;
===Using Qemu to boot Linux from a flash drive within Windows===&lt;br /&gt;
&lt;br /&gt;
The following tutorial explains how to use Qemu to boot Linux from a portable USB flash device while still working within Windows. This Enables the user to have both systems running at the same time eliminating the need to restart the PC and set your BIOS options to boot Linux.&lt;br /&gt;
&lt;br /&gt;
[http://www.pendrivelinux.com/2007/03/09/use-qemu-to-boot-linux-from-windows/ PendriveLinux article]&lt;br /&gt;
&lt;br /&gt;
===Putting a vnc server on openmoko===&lt;br /&gt;
&lt;br /&gt;
That's another alternative :)&lt;br /&gt;
&lt;br /&gt;
===The BlackDog project===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;When plugged into the host computer’s USB port, BlackDog starts up, '''automatically launching the X Window system for Windows Xming and a software NAT router via an autorun application that the BlackDog presents to the host through a virtual USB CD-ROM. Once those applications are running, the virtual USB CD-ROM drive disconnects, and a virtual USB-to-Ethernet adapter is connected to provide the communications link.'''&lt;br /&gt;
&lt;br /&gt;
The host machine’s monitor, keyboard, mouse, and Internet connection are used by the BlackDog for the duration of the session.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The [http://en.wikipedia.org/wiki/BlackDog BlackDog server] project has lots of interesting concepts (and software). Could [http://www.jasonkolb.com/weblog/2006/11/idea_7_personal.html personal servers] change the face of computing ? Together with biometry, ''they open up the possibility of carrying your personal server, or an extension of it, with you on your physical person. The reason this is so exciting is because it enables biometric authentication that doesn't require shipping your biometric data to a third party'.&lt;br /&gt;
&lt;br /&gt;
==Interesting distros/payloads==&lt;br /&gt;
&lt;br /&gt;
'''System diagnostics / recovery'''&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Memtest Memtest86+] Very small&lt;br /&gt;
*[http://www.ultimatebootcd.com/ The Ultimate Boot CD]&lt;br /&gt;
*[http://www.sysresccd.org/Main_Page System Rescue CD]&lt;br /&gt;
*[http://www.tux.org/pub/people/kent-robotti/looplinux/rip/ Recovery IS Possible] &amp;lt; 80 MB&lt;br /&gt;
&lt;br /&gt;
'''General purpose'''&lt;br /&gt;
*[http://jinx-linux.sourceforge.net/ jinx-linux] &amp;lt; 50 MB&lt;br /&gt;
*[http://knoppix.com/ Knoppix] 700 MB CD-ROM&lt;br /&gt;
*[http://www.puppylinux.org PuppyLinux] &amp;lt; 100 MB&lt;br /&gt;
*[http://www.damnsmalllinux.org DSL] ~50 MB&lt;br /&gt;
*[http://gentoo-wiki.com/TinyGentoo#What_is_this_.3F TinyGentoo] 5 MB&lt;br /&gt;
&lt;br /&gt;
'''Security-oriented''': pentesting, forensics, anonymous webbrowsing&lt;br /&gt;
*[http://www.darknet.org.uk/2006/03/10-best-security-live-cd-distros-pen-test-forensics-recovery/ List of Security distros]&lt;br /&gt;
*[http://www.remote-exploit.org/backtrack.html Backtrack Livecd]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Anonym.OS Anonym.OS: browse the web anonymously]&lt;br /&gt;
*[http://dban.sourceforge.net/ Darik's Boot and Nuke]: ''dangerous''&lt;br /&gt;
*[http://byzgl.sourceforge.net/wiki/index.php/Main_Page Byzantine OS] is a webkiosk appliance (32/48 MB)&lt;br /&gt;
&lt;br /&gt;
The SabayonLinux distro offers a lot of [http://www.sabayonlinux.org/wiki/index.php?title=Sabayon_Linux#Boot_Methods_for_special_ways_of_using_Sabayon boot cheatcodes], such as booting onto GeexBox. We should take a look at the method used.&lt;br /&gt;
&lt;br /&gt;
'''[http://www.livecdlist.com/ List of live distros @ livecdlist.com]''' ''Includes sizes''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/List_of_LiveDistros List of live distros @ wikipedia]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://distrowatch.com/dwres.php?resource=cd List of live distros @ distrowatch]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB article]'''&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro</id>
		<title>Wishlist/LiveUSB distro</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro"/>
				<updated>2007-08-25T00:37:32Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{wishlist}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
NOTE: this page may be renamed: portable destkop&lt;br /&gt;
&lt;br /&gt;
An openmoko device could act as '''the perfect geeky swiss knive''': go anywhere with your Linux desktop and tools.&lt;br /&gt;
&lt;br /&gt;
YES, there are tons of liveCDs out there, but CDs/DVDs:&lt;br /&gt;
* get easily damaged&lt;br /&gt;
* don't fit in a pocket (except for businesscard-sized ones ; too exotic...)&lt;br /&gt;
* don't update or save settings/personal data without a supplementary USB device&lt;br /&gt;
&lt;br /&gt;
YES, there are LiveUSB distros but:&lt;br /&gt;
* a Neo/OpenMoko device IS sort of an USB stick; one object is better than two&lt;br /&gt;
* you may carry my cellphone everywhere, what about usb sticks or cds ?&lt;br /&gt;
&lt;br /&gt;
The biggest argument against these ones is that you'd have to carry an USB cable with you... But it's a standard one, which is good news :) An integrated zippable plug could be an interesting add-on...&lt;br /&gt;
&lt;br /&gt;
Similar functionality can be found in [http://en.wikipedia.org/wiki/Wizpy the Wizpy portable media player], but relies on different methods for working under Windows (cd-rom emulation).&lt;br /&gt;
&lt;br /&gt;
When the openmoko device is in mass storage mode, a host computer should be able to boot on it, presenting a grub menu offering to boot into several images / partitions (payloads) on the transflash: memtest, UBCD (the ultimate boot cd), a lightweight security oriented livecd distro, you name it... &lt;br /&gt;
&lt;br /&gt;
It's sometimes called Live USB: from [http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB definition], ''A live USB is a USB flash drive containing a full operating system which can be booted from. Live USBs are closely related to Live CDs, and are sometimes used interchangeably. Like Live CDs, Live USBs can be used for system administration, data recovery, or the testing of operating system distributions without committing to a permanent installation on the local hard drive. Many of the smaller Linux distributions can also be used from a USB flash drive.''&lt;br /&gt;
&lt;br /&gt;
Usually, all you need for this with an USB storage device (flash USB stick or external drive) is a partition, flagged &amp;quot;bootable&amp;quot; (see fdisk), containing a boot loader (say grub). But the problem is that specifications vary between motherboards, so there are variants and mandatory requirements to define (here would be a good idea), so that one can optimize/maximize the compatibility.&lt;br /&gt;
&lt;br /&gt;
==The perfect geek knife==&lt;br /&gt;
&lt;br /&gt;
We may want to start our own distro with the following constraints:&lt;br /&gt;
* Multiboot: small utilities/compilations + bull blown light OS&lt;br /&gt;
* Aiming at maximum hardware compatibility, possibly using liveCD technology (knoppix-based distros)&lt;br /&gt;
* Aiming at minimum resource+system footprint, and boot speed&lt;br /&gt;
* Being able to install software temporary (for the session) or permanently, upgradable&lt;br /&gt;
* Being able to use the phone features at the same time (access pim, data &amp;amp; calls)&lt;br /&gt;
&lt;br /&gt;
Optimally, being able to charge the device while plugged in would be great too.&lt;br /&gt;
&lt;br /&gt;
==About USB Booting==&lt;br /&gt;
&lt;br /&gt;
From [http://www.damnsmalllinux.org/wiki/index.php/USB_Booting DSL Wiki]:&lt;br /&gt;
&lt;br /&gt;
Older computer BIOS usually do not support direct booting from a USB device. Around 2001, PC motherboard manufacturers started to add USB boot support.&lt;br /&gt;
&lt;br /&gt;
There are two common BIOS methods for direct USB booting:&lt;br /&gt;
* One method is called the &amp;quot;USBHDD&amp;quot; method and it is used to support the booting of standard USB mass storage devices that are configured like a normal PC hard drive.&lt;br /&gt;
* The other method is called the &amp;quot;USBZIP&amp;quot; method and it supports booting from a USB storage device that behaves like the original IOMEGA ZIP drive with USB support. &lt;br /&gt;
&lt;br /&gt;
Most computers (just about all Dells, for example) made today have a BIOS that supports the USBHDD method so I expect that this will eventually become the standard way to boot a USB device. However, many motherboards will support BOTH methods, and many older motherboards have USBZIP support.&lt;br /&gt;
&lt;br /&gt;
Some newer BIOSs which support USB 2.0 will not boot from an older pen drive. Using a USB 2.0 compliant one usually solves this problem. Also, some older BIOSs which only support USB 1.1 will not boot from newer drives which support USB 2.0!&lt;br /&gt;
&lt;br /&gt;
Some USB keys don't boot. If this is the case, it may be possible to fix them by installing a new master boot record. (Most keys boot OK by default; some cannot be fixed even by doing this. However, it helps in some cases). Run the command:&lt;br /&gt;
&lt;br /&gt;
  lilo -M /dev/sda&lt;br /&gt;
&lt;br /&gt;
==USB Booting in Neo1973's kernel==&lt;br /&gt;
&lt;br /&gt;
Although there is very little information about it, the g_storage kernel module is responsible for the Neo's mass storage mode. So the boot-or-not criteria might rely on this very module.&lt;br /&gt;
&lt;br /&gt;
==TODO==&lt;br /&gt;
&lt;br /&gt;
Testing/further research has to be conducted to determine:&lt;br /&gt;
* if a bootable-flagged partition / grub doesn't mess openmoko up&lt;br /&gt;
* if the phone can still act as a phone, or if the booted os can use the gprs functions&lt;br /&gt;
* if the phone can recharge on mass storage mode (from the usb cable)&lt;br /&gt;
* if a dedicated partition for each payload is needed (see memtest example...)&lt;br /&gt;
* if multi-boot is possible: grub?&lt;br /&gt;
&lt;br /&gt;
==Linux distro Howto's: liveUSB creation==&lt;br /&gt;
&lt;br /&gt;
In short:&lt;br /&gt;
#Mount USB drive, with e.g. mount /dev/sda1 /flash - can be either FAT16 or FAT32!&lt;br /&gt;
#Mount ISO image, with e.g. mount /tmp/dsl-3.2.iso /tmp/iso -o loop&lt;br /&gt;
#Copy all contents from ISO to USB drive: cp -vr /tmp/iso/* /flash/&lt;br /&gt;
#Rename and move syslinux files to root directory: mv /flash/boot/isolinux/* /flash/&lt;br /&gt;
#Rename isolinux.cfg: mv /flash/isolinux.cfg /flash/syslinux.cfg&lt;br /&gt;
#Unmount USB drive: umount /flash&lt;br /&gt;
#Install syslinux: syslinux /dev/sda1 and eventually set the MBR boot flag for this partition (with fdisk). &lt;br /&gt;
&lt;br /&gt;
*Fedora Core's [http://revisor.fedoraunity.org Revisor] enables easy GUI-driven ISO customization, allowing to choose the output medium (CD/DVD/USB)&lt;br /&gt;
*[http://www.damnsmalllinux.org/wiki/index.php/Installing_to_a_USB_Flash_Drive Installing DSL to USB device - using grub]&lt;br /&gt;
*[http://wiki.debian.org/BootUsb Debian BootUSB - using Lilo]&lt;br /&gt;
*[http://www.debuntu.org/how-to-install-ubuntu-linux-on-usb-bar Howto install ubuntu (or any other distro) on usb stick]&lt;br /&gt;
*[http://www.gentoo.org/doc/en/liveusb.xml Gentoo on usb stick]&lt;br /&gt;
*[http://pendrivelinux.com/ Windows &amp;amp; Linux tutorials &amp;amp; resources]:     &lt;br /&gt;
    * Flash installation via Windows: XUbuntu, DSL, Knoppix, Slax, MiniMe&lt;br /&gt;
    * Flash installation via Linux: Ubuntu Edgy, Knoppix, PCLinuxOS&lt;br /&gt;
&lt;br /&gt;
'''Transflash partitioning schema example'''&lt;br /&gt;
&lt;br /&gt;
* 2 Gb: /dev/sd? (where N is the transflash's number)&lt;br /&gt;
* 700 Mb: /dev/sd?1 : containing bootable iso, FAT16&lt;br /&gt;
* 1300 Mb: /dev/sd?2 : openmoko &amp;amp; bootable os home partition, EXT3?&lt;br /&gt;
* + eventually a swap&lt;br /&gt;
&lt;br /&gt;
The limitation of this method is that the booted OS is static (not-self modifiable). There's the option to install linux using the partition, but it's not really mobility-oriented (liveCDs are optimized for maximum autoconfiguration).&lt;br /&gt;
&lt;br /&gt;
==Alternative methods==&lt;br /&gt;
&lt;br /&gt;
===Booting ISOs ?===&lt;br /&gt;
&lt;br /&gt;
* Grub? From [http://www.freesoftwaremagazine.com/articles/grub_intro#comment-12900 How to install grub on an usb pendrive]:&lt;br /&gt;
    If you want to boot from a iso file on a harddisk, do something in menu.lst like&lt;br /&gt;
    title Boot from iso on a harddisk&lt;br /&gt;
    map (hdX,Y)/your.iso (hdZ)&lt;br /&gt;
    map --rehook&lt;br /&gt;
    chainloader (hdZ)+1&lt;br /&gt;
    rootnoverify (hdZ)&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
Grub &amp;amp; memdisk can boot floppy images, but (AFAIK) not isos. Example from the stock /boot/grub/menu.lst ubuntu:&lt;br /&gt;
    title           Ubuntu, memtest86+&lt;br /&gt;
    root            (hd0,2)&lt;br /&gt;
    kernel          /memtest86+.bin&lt;br /&gt;
    quiet&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
''Using the memdisk kernel from the syslinux package, you can load disk images and execute them in a non-emulated environment.''&lt;br /&gt;
&lt;br /&gt;
* [http://www.knoppix.net/wiki/Cheat_Codes knoppix '''bootfrom''' cheatcode]&lt;br /&gt;
&lt;br /&gt;
    bootfrom=/dev/hda1/KNX.iso &lt;br /&gt;
&lt;br /&gt;
Bootfrom needs access to a running Knoppix-System '''with the same Kernel as the Bootkernel''', before it is able to mount the partition / ISO-Image.  &lt;br /&gt;
&lt;br /&gt;
* Maybe there's a way to achieve a boot cd iso selecter see ([http://www.linuxquestions.org/questions/showthread.php?t=528840 this post])&lt;br /&gt;
* virtualization-oriented distro... ex [http://unit.aist.go.jp/itri/knoppix/xen/index-en.html Xenoppix] Cons: would work best only on modern VT-capable computers. What about a very minimal distribution (say DSL without X) kqemu-enblaed, booting into an ncurses iso-loader? The delicate part would be on the networking side.&lt;br /&gt;
&lt;br /&gt;
===Zero-Install / Networked systems===&lt;br /&gt;
&lt;br /&gt;
*[http://klik.atekon.de/wiki/index.php/Main_Page Klik] with more than 1000 packages ported. See [http://klik.atekon.de/wiki/index.php/Comparison comparison chart].&lt;br /&gt;
*[http://0install.net/index.html The Zero Install System], with automatic dependancies, upgrading. See [http://0install.net/matrix.html] comparison chart.&lt;br /&gt;
*Why not rolling a [http://wiki.rpath.com/wiki/Conary:Concepts Conary/RPath-based] distro, based on [http://www.rpath.com/rbuilder/project/rpath/ rPath linux] reference distribution ? Or choose within the available ones...&lt;br /&gt;
* The FUSE [http://httpfs.sourceforge.net/net_boot.htm httpfs] may allow pure http net booting, downloading files from a distant livecd only when needed (this image may be very minimal though).&lt;br /&gt;
* [http://developer.amazonwebservices.com/connect/thread.jspa?threadID=10271&amp;amp;start=75&amp;amp;tstart=0 some people] hare thinking of using Amazon S3 as virtual disk&lt;br /&gt;
&lt;br /&gt;
===Using Qemu to boot Linux from a flash drive within Windows===&lt;br /&gt;
&lt;br /&gt;
The following tutorial explains how to use Qemu to boot Linux from a portable USB flash device while still working within Windows. This Enables the user to have both systems running at the same time eliminating the need to restart the PC and set your BIOS options to boot Linux.&lt;br /&gt;
&lt;br /&gt;
[http://www.pendrivelinux.com/2007/03/09/use-qemu-to-boot-linux-from-windows/ PendriveLinux article]&lt;br /&gt;
&lt;br /&gt;
===Putting a vnc server on openmoko===&lt;br /&gt;
&lt;br /&gt;
That's another alternative :)&lt;br /&gt;
&lt;br /&gt;
===The BlackDog project===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;When plugged into the host computer’s USB port, BlackDog starts up, '''automatically launching the X Window system for Windows Xming and a software NAT router via an autorun application that the BlackDog presents to the host through a virtual USB CD-ROM. Once those applications are running, the virtual USB CD-ROM drive disconnects, and a virtual USB-to-Ethernet adapter is connected to provide the communications link.'''&lt;br /&gt;
&lt;br /&gt;
The host machine’s monitor, keyboard, mouse, and Internet connection are used by the BlackDog for the duration of the session.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The [http://en.wikipedia.org/wiki/BlackDog BlackDog server] project has lots of interesting concepts (and software). Could [http://www.jasonkolb.com/weblog/2006/11/idea_7_personal.html personal servers] change the face of computing ? Together with biometry, ''they open up the possibility of carrying your personal server, or an extension of it, with you on your physical person. The reason this is so exciting is because it enables biometric authentication that doesn't require shipping your biometric data to a third party'.&lt;br /&gt;
&lt;br /&gt;
==Interesting distros/payloads==&lt;br /&gt;
&lt;br /&gt;
'''System diagnostics / recovery'''&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Memtest Memtest86+] Very small&lt;br /&gt;
*[http://www.ultimatebootcd.com/ The Ultimate Boot CD]&lt;br /&gt;
*[http://www.sysresccd.org/Main_Page System Rescue CD]&lt;br /&gt;
*[http://www.tux.org/pub/people/kent-robotti/looplinux/rip/ Recovery IS Possible] &amp;lt; 80 MB&lt;br /&gt;
&lt;br /&gt;
'''General purpose'''&lt;br /&gt;
*[http://jinx-linux.sourceforge.net/ jinx-linux] &amp;lt; 50 MB&lt;br /&gt;
*[http://knoppix.com/ Knoppix] 700 MB CD-ROM&lt;br /&gt;
*[http://www.puppylinux.org PuppyLinux] &amp;lt; 100 MB&lt;br /&gt;
*[http://www.damnsmalllinux.org DSL] ~50 MB&lt;br /&gt;
*[http://gentoo-wiki.com/TinyGentoo#What_is_this_.3F TinyGentoo] 5 MB&lt;br /&gt;
&lt;br /&gt;
'''Security-oriented''': pentesting, forensics, anonymous webbrowsing&lt;br /&gt;
*[http://www.darknet.org.uk/2006/03/10-best-security-live-cd-distros-pen-test-forensics-recovery/ List of Security distros]&lt;br /&gt;
*[http://www.remote-exploit.org/backtrack.html Backtrack Livecd]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Anonym.OS Anonym.OS: browse the web anonymously]&lt;br /&gt;
*[http://dban.sourceforge.net/ Darik's Boot and Nuke]: ''dangerous''&lt;br /&gt;
*[http://byzgl.sourceforge.net/wiki/index.php/Main_Page Byzantine OS] is a webkiosk appliance (32/48 MB)&lt;br /&gt;
&lt;br /&gt;
The SabayonLinux distro offers a lot of [http://www.sabayonlinux.org/wiki/index.php?title=Sabayon_Linux#Boot_Methods_for_special_ways_of_using_Sabayon boot cheatcodes], such as booting onto GeexBox. We should take a look at the method used.&lt;br /&gt;
&lt;br /&gt;
'''[http://www.livecdlist.com/ List of live distros @ livecdlist.com]''' ''Includes sizes''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/List_of_LiveDistros List of live distros @ wikipedia]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://distrowatch.com/dwres.php?resource=cd List of live distros @ distrowatch]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB article]'''&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Talk:E17</id>
		<title>Talk:E17</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Talk:E17"/>
				<updated>2007-08-24T22:46:29Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Are there some news on the developement of the E17 version for OpenMoko? --[[User:Denis std|denis_std]] 22:28, 30 June 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
Yes, apparently the EFL are going to be used. Some video demos (ex kinetic scrolling) are around and seem to be made using EFL's, but nothing official. An e17 port is nowhere realistic in the contrary to EFL use (at least it won't before the hardware would take advantage of regular X apps -- ex. vga output + very good hardware).&lt;br /&gt;
--[[User:fthiery|flo]] 22:28, 30 June 2007 (CEST)&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Talk:E17</id>
		<title>Talk:E17</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Talk:E17"/>
				<updated>2007-08-24T22:46:04Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Are there some news on the developement of the E17 version for OpenMoko? --[[User:Denis std|denis_std]] 22:28, 30 June 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
Yes, apparently the EFL are going to be used. Some video demos (ex kinetic scrolling) are around and seem to be made using EFL's, but nothing official. An e17 port is nowhere realistic in the contrary to EFL use (at least it won't before the hardware would take advantage of regular X apps -- ex. vga output + very good hardware).&lt;br /&gt;
--[[User:Flo|fthiery]] 22:28, 30 June 2007 (CEST)&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Talk:E17</id>
		<title>Talk:E17</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Talk:E17"/>
				<updated>2007-08-24T22:45:07Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Are there some news on the developement of the E17 version for OpenMoko? --[[User:Denis std|denis_std]] 22:28, 30 June 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
Yes, apparently the EFL are going to be used. Some video demos (ex kinetic scrolling) are around and seem to be made using EFL's, but nothing official. An e17 port is nowhere realistic in the contrary to EFL use (at least it won't before the hardware would take advantage of regular X apps -- ex. vga output + very good hardware).&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/UI_Improvements</id>
		<title>UI Improvements</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/UI_Improvements"/>
				<updated>2007-08-04T12:25:15Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Clutter Toolkit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
  Obviously the tools are in the wild to build interfaces that could rival&lt;br /&gt;
  (or better IMO) anything Apple comes up with. We just need to organize&lt;br /&gt;
  this stuff. This would need hardware that can support dynamic&lt;br /&gt;
  interfaces. I can help here, too.&lt;br /&gt;
  sean@openmoko.com&lt;br /&gt;
&lt;br /&gt;
In fact, this place shall be dedicated to human-machine interactions improvements discussion;&lt;br /&gt;
&lt;br /&gt;
Human-machine interaction can be separated into several aspects:&lt;br /&gt;
* the physical contact/input device: the mono-touch touchscreen&lt;br /&gt;
* the graphics: &lt;br /&gt;
** accelerated rendering can add more consistency to zooming user interfaces, which seem to be quite an interesting concept for embedded scrensize-limited devices&lt;br /&gt;
** adding physics &amp;quot;look and feel&amp;quot; to (ex: menu's) behaviours can add coherence too&lt;br /&gt;
* the input methods&lt;br /&gt;
** the virtual keyboard&lt;br /&gt;
** handgestures&lt;br /&gt;
&lt;br /&gt;
==Finding inspiration ...==&lt;br /&gt;
&lt;br /&gt;
===Seen Live===&lt;br /&gt;
&lt;br /&gt;
'''Multi-touch'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=89sz8ExZndc Multi-Touchscreen experiments video @youtube]&lt;br /&gt;
*[http://www.youtube.com/watch?v=nPqqfVLQ_qY iPhone UI features demo @youtube]&lt;br /&gt;
* Multi-touch on Linux with [http://www.youtube.com/watch?v=olWjnfBoY8E MPX]&lt;br /&gt;
&lt;br /&gt;
'''Zooming user interfaces'''&lt;br /&gt;
*[http://www.zenzui.com/products.html ZenZui], a [http://en.wikipedia.org/wiki/ZUI ZUI (zooming user interface)]&lt;br /&gt;
*[http://labs.live.com/Deepfish/videos.aspx Microsoft Bluefish's ZUI] (new mobile webbrowser)&lt;br /&gt;
*[http://googlesystem.blogspot.com/2007/04/opera-920-more-homepages-at-your.html Opera speed dial]&lt;br /&gt;
&lt;br /&gt;
'''Graphics'''&lt;br /&gt;
*[http://www.rasterman.com/files/eem.avi EEM], Rasterman's EFL libs on handelds proof of concept (doesn't DO anything, just showing off the EFLs on a handeld)&lt;br /&gt;
*[http://www.youtube.com/watch?v=8kLFPfaxQ6U&amp;amp;eurl= Nvidia's cutting-edge techno], an [http://www.khronos.org/openkode/ Openkode] demo&lt;br /&gt;
*[http://files.mdk.am/demos/graff-demo-3.avi Graff]'s inertia scroll list&lt;br /&gt;
&lt;br /&gt;
'''Science fiction'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=G_FS2TiK3AI UPMC Future?]&lt;br /&gt;
&lt;br /&gt;
'''Links:'''&lt;br /&gt;
*[http://elevate.sourceforge.net/links.html elevate project's links] sums up quite greatly the latest innovations in the desktop area&lt;br /&gt;
*[http://nooface.net/ Nooface] is a human-machine news site&lt;br /&gt;
*Asus-Intel's [http://www.hothardware.com/articles/Hands_on_with_the_ASUS_Eee/?page=2 Eee]'s interface&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===n-D navigation: the polyhedra inspiration===&lt;br /&gt;
&lt;br /&gt;
When we want to navigate files, mp3s in an mp3 player, etc... Every control that the application needs is a button. What about looking at the polyhedrons? We could find one for each usage, with as many surrounding subzones that may be used as controls. Ex: you need 5 buttons, let's take a pentagon with 5 surrounding zones all around. That way, it's always optimized...&lt;br /&gt;
&lt;br /&gt;
http://en.wikipedia.org/wiki/Polyhedra&lt;br /&gt;
http://en.wikipedia.org/wiki/List_of_uniform_polyhedra&lt;br /&gt;
&lt;br /&gt;
===Our weapons===&lt;br /&gt;
&lt;br /&gt;
We can't improve the human-machine interface without knowing the strengths / weaknesses of our hardware; some of the weaknesses might turn out as exploitable features, some strengths as limiting constraints.&lt;br /&gt;
&lt;br /&gt;
====The touchscreen====&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What exactly does the touchscreen see when  you touch the screen with 2 fingers&lt;br /&gt;
  at the same time, when you move them, when you move only one of the 2, etc. I'm &lt;br /&gt;
  also interested in knowing how precise the touchscreen is (ex: refresh rate, &lt;br /&gt;
  possible pressure indication, ...)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* The output is the center of the bounding box of the touched area&lt;br /&gt;
* The touch point skips instantly on double touch&lt;br /&gt;
* Pressure has almost no effect on a single touch, but not so on a double touch. The relative pressures will cause a significant skewing effect towards the harder touch. You can easily move the pointer along the line between your two fingers by changing the relative pressure.&lt;br /&gt;
&lt;br /&gt;
Conclusions:&lt;br /&gt;
* we can detect double touch as jumps, and that's all&lt;br /&gt;
* no pressure&lt;br /&gt;
* This could be an interesting input method for games - e.g. holding the Neo in landscape view, letting each thumb rest on a specific input area; probably needs to be checked for usability with a real device&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when sliding two fingers in parallel up(L,R)-&amp;gt;down(L,R)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see a slide along the center line between your two fingers. In practice, you can't keep the pressure equal, so you will see some kind of zig-zag line somewhere between the two pressure points in the direction of your slide.&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when narrowing two fingers in slide (=zoom effect on iphone)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see the pointer stay at the center of the zoom movement. In practice, you can't keep the pressure equal for both fingers, so the pointer will move towards one of the two pressure points.&lt;br /&gt;
&lt;br /&gt;
====Graphics and computational capabilities====&lt;br /&gt;
&lt;br /&gt;
It would be good to report what performance the current hardware allows:&lt;br /&gt;
* There was no pure X11 benchmarking done (AFAIK) (how many fps at full VGA scrolling, ex: 1024*480 image scrolling?)&lt;br /&gt;
* what about the lcd reactivity? What if we don't see anything but blur while moving items fast?&lt;br /&gt;
&lt;br /&gt;
Please report here your impressions.&lt;br /&gt;
&lt;br /&gt;
==Areas of improvement==&lt;br /&gt;
&lt;br /&gt;
* OpenGL for fluid zooming interfaces (2D: the infinite sphere model, 1D: the infinite wheel of fortune/ribbon model, exposé)&lt;br /&gt;
* HandGestures&lt;br /&gt;
* Physics-model based improvements: inertia and friction&lt;br /&gt;
* multi touch screen for natural handgestures &lt;br /&gt;
* improved virtual keyboard&lt;br /&gt;
* switching to another GUI toolkit (EFLs)&lt;br /&gt;
&lt;br /&gt;
===Physics-inspired animation a.k.a. &amp;quot;Digital Physics&amp;quot;===&lt;br /&gt;
&lt;br /&gt;
If we want to add eye candy &amp;amp; usability to the UI (such as smooth realistic list scrolling, as seen in apple's&lt;br /&gt;
iphone demo on contacts lists for instance), we'll need a physics engine, so that moves &amp;amp; animations aren't all linear.&lt;br /&gt;
&lt;br /&gt;
The following aticle explains the [http://www.readwriteweb.com/archives/the_physics_of_iphone.php Digital Physics] term from the iPhone example.&lt;br /&gt;
&lt;br /&gt;
The most used technique for calculating trajectories and systems of related geometrical objects seems to be [http://en.wikipedia.org/wiki/Verlet_integration verlet integration] implementation; it is an alternative to Euler's integration method, using fast approximation. &lt;br /&gt;
&lt;br /&gt;
We may have no need for such a mathematical method at first, but perhaps there are other use cases. For instance, it may be useful to gesture recognition (i'm not aware if existing gesture recognition engines measure speed, acceleration...).&lt;br /&gt;
&lt;br /&gt;
====Open Dynamics Engine====&lt;br /&gt;
&lt;br /&gt;
ODE is an open source, high performance library for simulating rigid body dynamics. It is fully featured, stable, mature and platform independent with an easy to use C/C++ API. It has advanced joint types and integrated collision detection with friction. ODE is useful for simulating vehicles, objects in virtual reality environments and virtual creatures. It is currently used in many computer games, 3D authoring tools and simulation tools.&lt;br /&gt;
&lt;br /&gt;
http://www.ode.org/&lt;br /&gt;
&lt;br /&gt;
====Libakamaru====&lt;br /&gt;
&lt;br /&gt;
The [http://people.freedesktop.org/~krh/akamaru.git/ akamaru library] is the code behind [http://www.youtube.com/watch?v=VekgyKQoTeM kiba dock]'s fun and dynamic behaviour. It's dependencies are light (needs just GLib). It takes elasticity, friction, gravity into account.&lt;br /&gt;
&lt;br /&gt;
If you want to take a quick look at the code:&lt;br /&gt;
svn co http://svn.kiba-dock.org/akamaru/ akamaru&lt;br /&gt;
&lt;br /&gt;
The only (AFAIK) application using this library is kiba-dock, a *fun* app launcher, but we may find another use to it in the future.&lt;br /&gt;
&lt;br /&gt;
As suggested on the mailing list, it is mostly overkill for the uses we intend to have, but this library may be optimized already, the API can spare some time for too. Furthermore, ''Qui peut le plus, peut le moins''.&lt;br /&gt;
&lt;br /&gt;
====Verlet integration implementation from e17====&lt;br /&gt;
&lt;br /&gt;
There's an undergoing verlet integration implementation into the e17 project (by rephorm) see http://rephorm.com/news/tag/physics , so we may see some UI physics integration into e17 someday.&lt;br /&gt;
&lt;br /&gt;
====Robert Pernner's easy equations====&lt;br /&gt;
&lt;br /&gt;
http://www.robertpenner.com/easing/&lt;br /&gt;
&lt;br /&gt;
See the demo: implements non linear behaviour (actionscript), but may give inspiration&lt;br /&gt;
&lt;br /&gt;
===Extending the touchscreen capabilities and input methods===&lt;br /&gt;
&lt;br /&gt;
* '''Multitouchscreen emulation'''&lt;br /&gt;
&lt;br /&gt;
If we got it right, when touching the screen on a second place, the cursor oscillates between the two points depending on relative pressure distribution. Using averaging algorithms, we may have the opportunity to detect peculiar behaviours.&lt;br /&gt;
&lt;br /&gt;
We need raw data (x,y,t) from the real hardware for the following behaviours:&lt;br /&gt;
* slide two fingers in parallel - vertical up/down (scroll)&lt;br /&gt;
* turn the two fingers around (rotate)&lt;br /&gt;
* slide two fingers towards each other (zoom-)&lt;br /&gt;
* slide two fingers apart (zoom+)&lt;br /&gt;
&lt;br /&gt;
When touching the screen with two fingers at the same time, we necessarily see the two points, or are able to extrapolate the position of the second one. This solution can add feature, but will probably be little erratic...&lt;br /&gt;
&lt;br /&gt;
* '''Touchscreen kernel module hacking'''&lt;br /&gt;
&lt;br /&gt;
We may correct the &amp;quot;half distance&amp;quot; phenomenon on double touch: if double touch is detected, then assimilate the cursor as twice further than the first touch. It would allow finer control, but higher instability.&lt;br /&gt;
&lt;br /&gt;
The double touch detection may be implemented in the driver itself, as well as stabilization.&lt;br /&gt;
&lt;br /&gt;
* '''Other detectable behaviours'''&lt;br /&gt;
&lt;br /&gt;
The warping can be used in the 4 diagonals, plus the up/down/right/left cross:&lt;br /&gt;
&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
  - 1            -  - 1          2 -  - 1            -  -      2       -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -             2-  -              -  - 2            -  -      1       -&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
&lt;br /&gt;
It's not double touch, but two sequential presses with a short time in between (~0.5 s)&lt;br /&gt;
&lt;br /&gt;
* '''Clever hacks'''&lt;br /&gt;
&lt;br /&gt;
It's been said that having no multitouch screen allows less freedom for innovation. Maybe we could get something out of our touchscreen drivers.&lt;br /&gt;
&lt;br /&gt;
Why ? Think of apple's scroll up/down feature on macbooks touchpads (which '''aren't multi touch''', it's a [http://iscroll2.sourceforge.net/ clever driver hack, iscroll2]):&lt;br /&gt;
&lt;br /&gt;
  To scroll, just place two fingers on your trackpad instead of one. Both fingers&lt;br /&gt;
  need to be placed next to each other horizontally (not vertically, the trackpad &lt;br /&gt;
  cannot detect that). Some people get better results with their finger spaced a&lt;br /&gt;
  little bit apart, while others prefer having the fingers right next to each other.&lt;br /&gt;
&lt;br /&gt;
  iScroll2 provides two scrolling modes: Linear and circular scrolling.&lt;br /&gt;
&lt;br /&gt;
  For linear scrolling, move the two fingers up/down or left/right in a straight &lt;br /&gt;
  line, respectively, to scroll in that direction.&lt;br /&gt;
&lt;br /&gt;
  Circular scrolling works in a way similar to the iPod's scroll wheel: Move the two&lt;br /&gt;
  fingers in a circle to scroll up or down, depending   on whether you move in a &lt;br /&gt;
  clockwise or counterclockwise direction.&lt;br /&gt;
&lt;br /&gt;
Maybe we can port/adapt/get inspiration from this macintosh driver.&lt;br /&gt;
&lt;br /&gt;
===Improved virtual keyboard===&lt;br /&gt;
&lt;br /&gt;
One nice idea for virtual input is [http://www.micropp.se/openmoko/ finger-splash]&lt;br /&gt;
&lt;br /&gt;
Yet, optimization does not only apply to the plain one-letter-at-a-time input. We need some sort of T9 (dictionary-based input help). When typing a word, the first letter determines the next possible ones. Therefore, we may let disappear the less-probable following letters. Ex: type an L, there's no way an X follows...&lt;br /&gt;
&lt;br /&gt;
Hints: &lt;br /&gt;
* ZIP's huffmann compression applied to SMSs/mails for detecting the most used characters/words/sentences.&lt;br /&gt;
* html tag-clouds, one-letter tag clouds ; font size proportional to the probability of being used&lt;br /&gt;
&lt;br /&gt;
The most critical point is the initial disposition of the letters, before any letter is typed. We may also want to use horizontal two-parts keyboard (with the neo in hands like a psp..)&lt;br /&gt;
&lt;br /&gt;
The [http://www.strout.net/info/ideas/hexinput.html hexinput] concept is interesting. What about hiding the less probable letters and increasing the remaining ones during typing?&lt;br /&gt;
&lt;br /&gt;
===Towards OpenGL compositing===&lt;br /&gt;
&lt;br /&gt;
There are [http://www.hbmobile.org/wiki/index.php?title=GUI_Frameworks lots of possible GUI frameworks] with various software architectures that could be used for OpenMoko.&lt;br /&gt;
&lt;br /&gt;
GTA01 hardware uses GTK+/matchbox without hardware acceleration, and it's not enough: this is a first that a mobile Linux device has such a high DPI resolution. OpenGL ES compositing seems to have a bright future on embedded devices, because compositing seems to give natural zooming interfaces reality (at last!).&lt;br /&gt;
&lt;br /&gt;
Considering recent changes in destkop applications, opengl has a definite future. For instance, the expose (be it apple's or beryl's) is a very interesting and usable feature. Using compositing allows the physics metaphore: '''the human brain doesn't like &amp;quot;gaps&amp;quot;/jumps (for instance while scrolling a text), it needs continuity''', which can be provided by opengl. When you look at apple's iphone prototype, it's not just eye candy, it's maybe the most natural/human way of navigating, because it's sufficiently realistic for the brain to forget the non-physical nature of what's inside.&lt;br /&gt;
&lt;br /&gt;
So, opengl hardware will be needed in a more or less distant hardware, for 100% fluid operation. Benchmarking will be needed to compare the different alternatives that are cited further.&lt;br /&gt;
&lt;br /&gt;
====The Enlightenment Foundation Libraries====&lt;br /&gt;
&lt;br /&gt;
EFL's Evas is a powerful and power sparing canvas drawing library. It can be OpenGL accelerated. Python/Ruby bindings are available in the &amp;quot;proto&amp;quot; e17 cvs folder.&lt;br /&gt;
&lt;br /&gt;
''Moved [[E17|here]]''&lt;br /&gt;
&lt;br /&gt;
====Clutter Toolkit====&lt;br /&gt;
&lt;br /&gt;
Clutter, an [http://o-hand.com/ OpenedHand] project, is an open source software library for creating fast, visually rich graphical user interfaces. The most obvious example of potential usage is in media center type applications.&lt;br /&gt;
&lt;br /&gt;
http://clutter-project.org/&lt;br /&gt;
&lt;br /&gt;
Clutter uses OpenGL (and optionally '''OpenGL ES''') for rendering but with an API which hides the underlying GL complexity from the developer. The Clutter API is intended to be easy to use, efficient and flexible.&lt;br /&gt;
&lt;br /&gt;
It does integrate gstreamer (for easy media playback, even camera or mic inputs), allows pango text rendering, cairo graphics rendering. Provided bindings are python, C# and Ruby.&lt;br /&gt;
&lt;br /&gt;
GTK off screen rendering is supposed to be on it's way; once it is here, there will be a possibility of using GTK apps directly within OpenGL apps as textures, which would lead to the possibility of creating a full OpenGL &amp;quot;application manager&amp;quot; (as well as media consuming app) with ZUI features.&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C, OpenGL&lt;br /&gt;
* Bindings: Python, C#, Ruby&lt;br /&gt;
* Backends: GLX / SDL / EGL&lt;br /&gt;
* Media support: Gstreamer integration, Cairo graphics rendering, Pango fonts rendering&lt;br /&gt;
* Embedding: GTK embedding&lt;br /&gt;
&lt;br /&gt;
Some experimental code in the clutter svn show that embedded devices are one of it's targets:&lt;br /&gt;
* [http://svn.o-hand.com/repos/clutter/trunk/toys/foofone/ Some bulk phone dialing interface]&lt;br /&gt;
* Make sure to check out the [http://www.clutter-project.org/blog/?p=25 Clutter toys videos] to get a feeling of what can be done using clutter&lt;br /&gt;
&lt;br /&gt;
====Graff====&lt;br /&gt;
&lt;br /&gt;
An early demonstration of Graff, which ''is a lighweight high-performance graphics rendering library.''&lt;br /&gt;
http://www.mdk.org.pl/articles/2007/04/23/chapter-1-in-which-we-meet-graff&lt;br /&gt;
&lt;br /&gt;
Be sure to check out this demo (scrolling list with inertia scrolling)&lt;br /&gt;
http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Of course it will remind you of Apple iPhone's UI. But this one runs in software mode on Nokia N770&amp;amp;800 already. The most notable part of Graff seems to be the inertia and physics integration in general.&lt;br /&gt;
&lt;br /&gt;
====Pigment API====&lt;br /&gt;
&lt;br /&gt;
Fluendo's (the Gstreamer guys) ''[https://core.fluendo.com/pigment/trac Pigment] is a Python library designed to easily build user interfaces with embedded multimedia. Its design allows to use it on several platforms, thanks to a plugin system allowing to choose the underlying graphical API. Pigment is the rendering engine of Elisa, the Fluendo Media Center project.''&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C OpenGL&lt;br /&gt;
* Bindings: Python&lt;br /&gt;
* Backends: DirectFB OpenGL&lt;br /&gt;
* Media playback integration: using Gstreamer&lt;br /&gt;
&lt;br /&gt;
====Choosing====&lt;br /&gt;
&lt;br /&gt;
Benchmarking will be needed. We have therefore to define a std testing application that would allow to compare alternatives. &lt;br /&gt;
&lt;br /&gt;
Some Clutter VS Pigment information: http://www.taimila.com/?q=node/14&lt;br /&gt;
&lt;br /&gt;
==Improvement ideas==&lt;br /&gt;
&lt;br /&gt;
Please add here any idea that seems of relevance.&lt;br /&gt;
&lt;br /&gt;
===Kinetic scrolling===&lt;br /&gt;
&lt;br /&gt;
====EDIT: demo now on the neo====&lt;br /&gt;
&lt;br /&gt;
Apparently the topics discussed here have found an echo in moko devs :)&lt;br /&gt;
&lt;br /&gt;
http://dominion.kabel.utwente.nl/koen/cms/kinetic-scrolling-on-the-neo1973&lt;br /&gt;
&lt;br /&gt;
enjoy the video demo; everything seems to be rendered software fine. More details about the implementation to come.&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
&lt;br /&gt;
Graff's inertia scrolling list example: http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Because an example is worth 1000s words...&lt;br /&gt;
&lt;br /&gt;
====Controls====&lt;br /&gt;
&lt;br /&gt;
* Sliding up/down = Single click + maintained for a minimal distance&lt;br /&gt;
&lt;br /&gt;
Effect: scroll in an inverted/negated fashion (slide down = scroll up, slide up = scroll down)&lt;br /&gt;
&lt;br /&gt;
When finger is released (i.e. touchscreen doesn't detect any press):&lt;br /&gt;
  if (last_speed_seen &amp;gt; 0 ) then keep this speed and acceleration, with friction&lt;br /&gt;
  else stop scrolling&lt;br /&gt;
&lt;br /&gt;
Scrolling here is seen as unidimensional, but can apply to bidimensional situations (ex: zoomed image) too&lt;br /&gt;
&lt;br /&gt;
* Action = quick double tap&lt;br /&gt;
&lt;br /&gt;
* Details/select = short single tap&lt;br /&gt;
&lt;br /&gt;
* Right click = long tap&lt;br /&gt;
&lt;br /&gt;
* Sliding left/right: switch sorting method&lt;br /&gt;
&lt;br /&gt;
====Parts to modify====&lt;br /&gt;
&lt;br /&gt;
''Having a scroll that isn't a 1:1 map to the user's action isn't hard. It's just an extra calculation in the scroll code.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;---- Where is the scroll code? :)&lt;br /&gt;
&lt;br /&gt;
* libmokoui&lt;br /&gt;
** [[Stylus_Scrolling | Stylus scrolling widget]]&lt;br /&gt;
** [[Finger_Scrolling | Finger scrolling wheel widget]]&lt;br /&gt;
* gtk&lt;br /&gt;
** [http://www.gtk.org/api/2.6/gtk/GtkVScrollbar.html GtkVScrollbar]&lt;br /&gt;
&lt;br /&gt;
The best would be to add the feature for both finger and stylus scrolling.&lt;br /&gt;
&lt;br /&gt;
TODO:&lt;br /&gt;
* make the entire list a &amp;quot;scrolling zone&amp;quot;, i.e. an overlay transparent scrolling widget?&lt;br /&gt;
* define controls&lt;br /&gt;
* add the inertia feature&lt;br /&gt;
&lt;br /&gt;
===1D Scrolling: inertia friction integration into openmoko's finger wheel=== &lt;br /&gt;
&lt;br /&gt;
The same, but for the wheel. It can be very short to do: you don't have 1:1 anymore, but, for example, 1/4 wheel turn = 1 item. It's demultiplicated, but has inertia.&lt;br /&gt;
&lt;br /&gt;
===Left-handed UI Support===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
A discussion on the community list identified a desire to have the ability to switch the OpenMoko UI into &amp;quot;left-handed&amp;quot; mode.  &lt;br /&gt;
&lt;br /&gt;
 The main problem is scrollbars, when they're on the right, dragging  &lt;br /&gt;
 the scrollbar left handed results in your hand covering the screen so  &lt;br /&gt;
 you can't see what you are doing. So having the option of scrollbars  &lt;br /&gt;
 on the left would be useful.&lt;br /&gt;
&lt;br /&gt;
 I don't think the whole screen should be mirrored! There are some elements&lt;br /&gt;
 that should remain..like the main top bar with the status icons and such.&lt;br /&gt;
 Scrollbars are the main thing I can think of right now.&lt;br /&gt;
&lt;br /&gt;
===Handgesture recognition proposals===&lt;br /&gt;
&lt;br /&gt;
====Using simple, localized warp as modifier key====&lt;br /&gt;
&lt;br /&gt;
As discussed on community list:&lt;br /&gt;
&lt;br /&gt;
  If you hold down one finger and tap the other one, the mouse pops over and back&lt;br /&gt;
  again. If you keep your second finger touching, the cursor follows it. When you&lt;br /&gt;
  release it, cursor goes back to first finger position. This could be a way to&lt;br /&gt;
  set a bounding box or turn on the mode. So the second finger can do something&lt;br /&gt;
  like rotating around the first, or increase or lower the distance to the first.&lt;br /&gt;
&lt;br /&gt;
* the so-called &amp;quot;first touch&amp;quot; can be done on the mokowheel zone itself: put your left thumb on the black area; if you touch the screen with another finger, there is a '''warp'''; the warp is detectable and allows to enter &amp;quot;fake multi-touchscreen mode&amp;quot;&lt;br /&gt;
* afterwards,&lt;br /&gt;
     * slide your right-hand finger down, it scrolls up&lt;br /&gt;
     * slide your right-hand finger up, it scrolls down&lt;br /&gt;
     * slide it left, next page/item&lt;br /&gt;
     * slide it right, previous page/item&lt;br /&gt;
     * do a circle: rotation&lt;br /&gt;
     * narrow towards the black circle: zoom -&lt;br /&gt;
     * go away: zoom +&lt;br /&gt;
* if you had kept your first finger on the black quarter circle, you can continue issuing other gestures&lt;br /&gt;
&lt;br /&gt;
The advantages of using simple origin-driven cursor warping as double touch detection criteria is that:&lt;br /&gt;
* you don't have to use the wheel as button, which would slow things down and generate errors (false button presses)&lt;br /&gt;
* simpler detection algorithms that can pass by the fluctuation due to pressure relative distribution&lt;br /&gt;
* the space taken by the wheel itself is &amp;quot;useless&amp;quot; (i.e. displays no information); using it as modifier allows to keep the screen clean for reading&lt;br /&gt;
* the origin of this zone lets use maximum surface of the screen, allowing more fine controlling&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_rotate_right.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_previous.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_down.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_zoom-.png]]&lt;br /&gt;
&lt;br /&gt;
*Pros:&lt;br /&gt;
** who said we need multi-touch hardware?&lt;br /&gt;
** this may be the easiest way (in terms of design/implementation complexity, reliability)&lt;br /&gt;
*Cons: &lt;br /&gt;
** no matter what we'll invent, we'll need two hands for on-the-move controlling&lt;br /&gt;
** what about left-handed people?&lt;br /&gt;
&lt;br /&gt;
====What is to modify ?====&lt;br /&gt;
&lt;br /&gt;
We need to emulate key presses. We need to work at a layer where we can get raw cursor coordinates. &amp;lt;---- X server layer?&lt;br /&gt;
&lt;br /&gt;
There is a fake keyboard module (for dev purposes) in the main kernel tree, which could be used to simulate keyboard presses (hence keeping keyboard-enabled apps unmodified).&lt;br /&gt;
&lt;br /&gt;
====Full multi-touch emulation====&lt;br /&gt;
&lt;br /&gt;
Doable, but tricky...&lt;br /&gt;
&lt;br /&gt;
==Preparing the multi touch==&lt;br /&gt;
&lt;br /&gt;
One day we might get multitouch devices. Let's get ready.&lt;br /&gt;
&lt;br /&gt;
===MPX===&lt;br /&gt;
 	&lt;br /&gt;
The Multi-Pointer X Server is a modification of the X server to support multiple mice and keyboards in X. It provides users with one cursor per device and one keyboard focus per keyboard. Each cursor can operate independently. MPX is the first multicursor windowing system and allows two-handed interaction with legacy applications, but also the creation of innovative applications and user interfaces. &lt;br /&gt;
&lt;br /&gt;
[http://wearables.unisa.edu.au/mpx/ The multipoint X server project]&lt;br /&gt;
&lt;br /&gt;
===MacSlow's Lowfat getting multitouched===&lt;br /&gt;
&lt;br /&gt;
http://dlai.jafu.dk/?p=1&lt;br /&gt;
&lt;br /&gt;
==Open questions==&lt;br /&gt;
&lt;br /&gt;
* will the neo/openmoko graphics system be powerful enough for such uses? I apple uses an OpenGL ES acceleration on this device (as well as on recent iPods), which is on the way with [[GTA02#.22Phase_2.22_.28GTA02.2C_.22Mass_Market.22.29|GTA02]].&lt;br /&gt;
* how does the touchscreen behave? We need a detailed touchscreen wiki information page, with visual traces. How hardware-specific is it?&lt;br /&gt;
* is multi touch really that awesome? I guess not.&lt;br /&gt;
&lt;br /&gt;
{{Languages|UI Improvements}}&lt;br /&gt;
&lt;br /&gt;
[[Category:User Interfaces| ]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/UI_Improvements</id>
		<title>UI Improvements</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/UI_Improvements"/>
				<updated>2007-07-31T16:35:21Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: fix typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
  Obviously the tools are in the wild to build interfaces that could rival&lt;br /&gt;
  (or better IMO) anything Apple comes up with. We just need to organize&lt;br /&gt;
  this stuff. This would need hardware that can support dynamic&lt;br /&gt;
  interfaces. I can help here, too.&lt;br /&gt;
  sean@openmoko.com&lt;br /&gt;
&lt;br /&gt;
In fact, this place shall be dedicated to human-machine interactions improvements discussion;&lt;br /&gt;
&lt;br /&gt;
Human-machine interaction can be separated into several aspects:&lt;br /&gt;
* the physical contact/input device: the mono-touch touchscreen&lt;br /&gt;
* the graphics: &lt;br /&gt;
** accelerated rendering can add more consistency to zooming user interfaces, which seem to be quite an interesting concept for embedded scrensize-limited devices&lt;br /&gt;
** adding physics &amp;quot;look and feel&amp;quot; to (ex: menu's) behaviours can add coherence too&lt;br /&gt;
* the input methods&lt;br /&gt;
** the virtual keyboard&lt;br /&gt;
** handgestures&lt;br /&gt;
&lt;br /&gt;
==Finding inspiration ...==&lt;br /&gt;
&lt;br /&gt;
===Seen Live===&lt;br /&gt;
&lt;br /&gt;
'''Multi-touch'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=89sz8ExZndc Multi-Touchscreen experiments video @youtube]&lt;br /&gt;
*[http://www.youtube.com/watch?v=nPqqfVLQ_qY iPhone UI features demo @youtube]&lt;br /&gt;
* Multi-touch on Linux with [http://www.youtube.com/watch?v=olWjnfBoY8E MPX]&lt;br /&gt;
&lt;br /&gt;
'''Zooming user interfaces'''&lt;br /&gt;
*[http://www.zenzui.com/products.html ZenZui], a [http://en.wikipedia.org/wiki/ZUI ZUI (zooming user interface)]&lt;br /&gt;
*[http://labs.live.com/Deepfish/videos.aspx Microsoft Bluefish's ZUI] (new mobile webbrowser)&lt;br /&gt;
*[http://googlesystem.blogspot.com/2007/04/opera-920-more-homepages-at-your.html Opera speed dial]&lt;br /&gt;
&lt;br /&gt;
'''Graphics'''&lt;br /&gt;
*[http://www.rasterman.com/files/eem.avi EEM], Rasterman's EFL libs on handelds proof of concept (doesn't DO anything, just showing off the EFLs on a handeld)&lt;br /&gt;
*[http://www.youtube.com/watch?v=8kLFPfaxQ6U&amp;amp;eurl= Nvidia's cutting-edge techno], an [http://www.khronos.org/openkode/ Openkode] demo&lt;br /&gt;
*[http://files.mdk.am/demos/graff-demo-3.avi Graff]'s inertia scroll list&lt;br /&gt;
&lt;br /&gt;
'''Science fiction'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=G_FS2TiK3AI UPMC Future?]&lt;br /&gt;
&lt;br /&gt;
'''Links:'''&lt;br /&gt;
*[http://elevate.sourceforge.net/links.html elevate project's links] sums up quite greatly the latest innovations in the desktop area&lt;br /&gt;
*[http://nooface.net/ Nooface] is a human-machine news site&lt;br /&gt;
*Asus-Intel's [http://www.hothardware.com/articles/Hands_on_with_the_ASUS_Eee/?page=2 Eee]'s interface&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===n-D navigation: the polyhedra inspiration===&lt;br /&gt;
&lt;br /&gt;
When we want to navigate files, mp3s in an mp3 player, etc... Every control that the application needs is a button. What about looking at the polyhedrons? We could find one for each usage, with as many surrounding subzones that may be used as controls. Ex: you need 5 buttons, let's take a pentagon with 5 surrounding zones all around. That way, it's always optimized...&lt;br /&gt;
&lt;br /&gt;
http://en.wikipedia.org/wiki/Polyhedra&lt;br /&gt;
http://en.wikipedia.org/wiki/List_of_uniform_polyhedra&lt;br /&gt;
&lt;br /&gt;
===Our weapons===&lt;br /&gt;
&lt;br /&gt;
We can't improve the human-machine interface without knowing the strengths / weaknesses of our hardware; some of the weaknesses might turn out as exploitable features, some strengths as limiting constraints.&lt;br /&gt;
&lt;br /&gt;
====The touchscreen====&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What exactly does the touchscreen see when  you touch the screen with 2 fingers&lt;br /&gt;
  at the same time, when you move them, when you move only one of the 2, etc. I'm &lt;br /&gt;
  also interested in knowing how precise the touchscreen is (ex: refresh rate, &lt;br /&gt;
  possible pressure indication, ...)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* The output is the center of the bounding box of the touched area&lt;br /&gt;
* The touch point skips instantly on double touch&lt;br /&gt;
* Pressure has almost no effect on a single touch, but not so on a double touch. The relative pressures will cause a significant skewing effect towards the harder touch. You can easily move the pointer along the line between your two fingers by changing the relative pressure.&lt;br /&gt;
&lt;br /&gt;
Conclusions:&lt;br /&gt;
* we can detect double touch as jumps, and that's all&lt;br /&gt;
* no pressure&lt;br /&gt;
* This could be an interesting input method for games - e.g. holding the Neo in landscape view, letting each thumb rest on a specific input area; probably needs to be checked for usability with a real device&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when sliding two fingers in parallel up(L,R)-&amp;gt;down(L,R)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see a slide along the center line between your two fingers. In practice, you can't keep the pressure equal, so you will see some kind of zig-zag line somewhere between the two pressure points in the direction of your slide.&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when narrowing two fingers in slide (=zoom effect on iphone)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see the pointer stay at the center of the zoom movement. In practice, you can't keep the pressure equal for both fingers, so the pointer will move towards one of the two pressure points.&lt;br /&gt;
&lt;br /&gt;
====Graphics and computational capabilities====&lt;br /&gt;
&lt;br /&gt;
It would be good to report what performance the current hardware allows:&lt;br /&gt;
* There was no pure X11 benchmarking done (AFAIK) (how many fps at full VGA scrolling, ex: 1024*480 image scrolling?)&lt;br /&gt;
* what about the lcd reactivity? What if we don't see anything but blur while moving items fast?&lt;br /&gt;
&lt;br /&gt;
Please report here your impressions.&lt;br /&gt;
&lt;br /&gt;
==Areas of improvement==&lt;br /&gt;
&lt;br /&gt;
* OpenGL for fluid zooming interfaces (2D: the infinite sphere model, 1D: the infinite wheel of fortune/ribbon model, exposé)&lt;br /&gt;
* HandGestures&lt;br /&gt;
* Physics-model based improvements: inertia and friction&lt;br /&gt;
* multi touch screen for natural handgestures &lt;br /&gt;
* improved virtual keyboard&lt;br /&gt;
* switching to another GUI toolkit (EFLs)&lt;br /&gt;
&lt;br /&gt;
===Physics-inspired animation a.k.a. &amp;quot;Digital Physics&amp;quot;===&lt;br /&gt;
&lt;br /&gt;
If we want to add eye candy &amp;amp; usability to the UI (such as smooth realistic list scrolling, as seen in apple's&lt;br /&gt;
iphone demo on contacts lists for instance), we'll need a physics engine, so that moves &amp;amp; animations aren't all linear.&lt;br /&gt;
&lt;br /&gt;
The following aticle explains the [http://www.readwriteweb.com/archives/the_physics_of_iphone.php Digital Physics] term from the iPhone example.&lt;br /&gt;
&lt;br /&gt;
The most used technique for calculating trajectories and systems of related geometrical objects seems to be [http://en.wikipedia.org/wiki/Verlet_integration verlet integration] implementation; it is an alternative to Euler's integration method, using fast approximation. &lt;br /&gt;
&lt;br /&gt;
We may have no need for such a mathematical method at first, but perhaps there are other use cases. For instance, it may be useful to gesture recognition (i'm not aware if existing gesture recognition engines measure speed, acceleration...).&lt;br /&gt;
&lt;br /&gt;
====Open Dynamics Engine====&lt;br /&gt;
&lt;br /&gt;
ODE is an open source, high performance library for simulating rigid body dynamics. It is fully featured, stable, mature and platform independent with an easy to use C/C++ API. It has advanced joint types and integrated collision detection with friction. ODE is useful for simulating vehicles, objects in virtual reality environments and virtual creatures. It is currently used in many computer games, 3D authoring tools and simulation tools.&lt;br /&gt;
&lt;br /&gt;
http://www.ode.org/&lt;br /&gt;
&lt;br /&gt;
====Libakamaru====&lt;br /&gt;
&lt;br /&gt;
The [http://people.freedesktop.org/~krh/akamaru.git/ akamaru library] is the code behind [http://www.youtube.com/watch?v=VekgyKQoTeM kiba dock]'s fun and dynamic behaviour. It's dependencies are light (needs just GLib). It takes elasticity, friction, gravity into account.&lt;br /&gt;
&lt;br /&gt;
If you want to take a quick look at the code:&lt;br /&gt;
svn co http://svn.kiba-dock.org/akamaru/ akamaru&lt;br /&gt;
&lt;br /&gt;
The only (AFAIK) application using this library is kiba-dock, a *fun* app launcher, but we may find another use to it in the future.&lt;br /&gt;
&lt;br /&gt;
As suggested on the mailing list, it is mostly overkill for the uses we intend to have, but this library may be optimized already, the API can spare some time for too. Furthermore, ''Qui peut le plus, peut le moins''.&lt;br /&gt;
&lt;br /&gt;
====Verlet integration implementation from e17====&lt;br /&gt;
&lt;br /&gt;
There's an undergoing verlet integration implementation into the e17 project (by rephorm) see http://rephorm.com/news/tag/physics , so we may see some UI physics integration into e17 someday.&lt;br /&gt;
&lt;br /&gt;
====Robert Pernner's easy equations====&lt;br /&gt;
&lt;br /&gt;
http://www.robertpenner.com/easing/&lt;br /&gt;
&lt;br /&gt;
See the demo: implements non linear behaviour (actionscript), but may give inspiration&lt;br /&gt;
&lt;br /&gt;
===Extending the touchscreen capabilities and input methods===&lt;br /&gt;
&lt;br /&gt;
* '''Multitouchscreen emulation'''&lt;br /&gt;
&lt;br /&gt;
If we got it right, when touching the screen on a second place, the cursor oscillates between the two points depending on relative pressure distribution. Using averaging algorithms, we may have the opportunity to detect peculiar behaviours.&lt;br /&gt;
&lt;br /&gt;
We need raw data (x,y,t) from the real hardware for the following behaviours:&lt;br /&gt;
* slide two fingers in parallel - vertical up/down (scroll)&lt;br /&gt;
* turn the two fingers around (rotate)&lt;br /&gt;
* slide two fingers towards each other (zoom-)&lt;br /&gt;
* slide two fingers apart (zoom+)&lt;br /&gt;
&lt;br /&gt;
When touching the screen with two fingers at the same time, we necessarily see the two points, or are able to extrapolate the position of the second one. This solution can add feature, but will probably be little erratic...&lt;br /&gt;
&lt;br /&gt;
* '''Touchscreen kernel module hacking'''&lt;br /&gt;
&lt;br /&gt;
We may correct the &amp;quot;half distance&amp;quot; phenomenon on double touch: if double touch is detected, then assimilate the cursor as twice further than the first touch. It would allow finer control, but higher instability.&lt;br /&gt;
&lt;br /&gt;
The double touch detection may be implemented in the driver itself, as well as stabilization.&lt;br /&gt;
&lt;br /&gt;
* '''Other detectable behaviours'''&lt;br /&gt;
&lt;br /&gt;
The warping can be used in the 4 diagonals, plus the up/down/right/left cross:&lt;br /&gt;
&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
  - 1            -  - 1          2 -  - 1            -  -      2       -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -             2-  -              -  - 2            -  -      1       -&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
&lt;br /&gt;
It's not double touch, but two sequential presses with a short time in between (~0.5 s)&lt;br /&gt;
&lt;br /&gt;
* '''Clever hacks'''&lt;br /&gt;
&lt;br /&gt;
It's been said that having no multitouch screen allows less freedom for innovation. Maybe we could get something out of our touchscreen drivers.&lt;br /&gt;
&lt;br /&gt;
Why ? Think of apple's scroll up/down feature on macbooks touchpads (which '''aren't multi touch''', it's a [http://iscroll2.sourceforge.net/ clever driver hack, iscroll2]):&lt;br /&gt;
&lt;br /&gt;
  To scroll, just place two fingers on your trackpad instead of one. Both fingers&lt;br /&gt;
  need to be placed next to each other horizontally (not vertically, the trackpad &lt;br /&gt;
  cannot detect that). Some people get better results with their finger spaced a&lt;br /&gt;
  little bit apart, while others prefer having the fingers right next to each other.&lt;br /&gt;
&lt;br /&gt;
  iScroll2 provides two scrolling modes: Linear and circular scrolling.&lt;br /&gt;
&lt;br /&gt;
  For linear scrolling, move the two fingers up/down or left/right in a straight &lt;br /&gt;
  line, respectively, to scroll in that direction.&lt;br /&gt;
&lt;br /&gt;
  Circular scrolling works in a way similar to the iPod's scroll wheel: Move the two&lt;br /&gt;
  fingers in a circle to scroll up or down, depending   on whether you move in a &lt;br /&gt;
  clockwise or counterclockwise direction.&lt;br /&gt;
&lt;br /&gt;
Maybe we can port/adapt/get inspiration from this macintosh driver.&lt;br /&gt;
&lt;br /&gt;
===Improved virtual keyboard===&lt;br /&gt;
&lt;br /&gt;
One nice idea for virtual input is [http://www.micropp.se/openmoko/ finger-splash]&lt;br /&gt;
&lt;br /&gt;
Yet, optimization does not only apply to the plain one-letter-at-a-time input. We need some sort of T9 (dictionary-based input help). When typing a word, the first letter determines the next possible ones. Therefore, we may let disappear the less-probable following letters. Ex: type an L, there's no way an X follows...&lt;br /&gt;
&lt;br /&gt;
Hints: &lt;br /&gt;
* ZIP's huffmann compression applied to SMSs/mails for detecting the most used characters/words/sentences.&lt;br /&gt;
* html tag-clouds, one-letter tag clouds ; font size proportional to the probability of being used&lt;br /&gt;
&lt;br /&gt;
The most critical point is the initial disposition of the letters, before any letter is typed. We may also want to use horizontal two-parts keyboard (with the neo in hands like a psp..)&lt;br /&gt;
&lt;br /&gt;
The [http://www.strout.net/info/ideas/hexinput.html hexinput] concept is interesting. What about hiding the less probable letters and increasing the remaining ones during typing?&lt;br /&gt;
&lt;br /&gt;
===Towards OpenGL compositing===&lt;br /&gt;
&lt;br /&gt;
There are [http://www.hbmobile.org/wiki/index.php?title=GUI_Frameworks lots of possible GUI frameworks] with various software architectures that could be used for OpenMoko.&lt;br /&gt;
&lt;br /&gt;
GTA01 hardware uses GTK+/matchbox without hardware acceleration, and it's not enough: this is a first that a mobile Linux device has such a high DPI resolution. OpenGL ES compositing seems to have a bright future on embedded devices, because compositing seems to give natural zooming interfaces reality (at last!).&lt;br /&gt;
&lt;br /&gt;
Considering recent changes in destkop applications, opengl has a definite future. For instance, the expose (be it apple's or beryl's) is a very interesting and usable feature. Using compositing allows the physics metaphore: '''the human brain doesn't like &amp;quot;gaps&amp;quot;/jumps (for instance while scrolling a text), it needs continuity''', which can be provided by opengl. When you look at apple's iphone prototype, it's not just eye candy, it's maybe the most natural/human way of navigating, because it's sufficiently realistic for the brain to forget the non-physical nature of what's inside.&lt;br /&gt;
&lt;br /&gt;
So, opengl hardware will be needed in a more or less distant hardware, for 100% fluid operation. Benchmarking will be needed to compare the different alternatives that are cited further.&lt;br /&gt;
&lt;br /&gt;
====The Enlightenment Foundation Libraries====&lt;br /&gt;
&lt;br /&gt;
EFL's Evas is a powerful and power sparing canvas drawing library. It can be OpenGL accelerated. Python/Ruby bindings are available in the &amp;quot;proto&amp;quot; e17 cvs folder.&lt;br /&gt;
&lt;br /&gt;
''Moved [[E17|here]]''&lt;br /&gt;
&lt;br /&gt;
====Clutter Toolkit====&lt;br /&gt;
&lt;br /&gt;
Clutter, an [http://o-hand.com/ OpenedHand] project, is an open source software library for creating fast, visually rich graphical user interfaces. The most obvious example of potential usage is in media center type applications.&lt;br /&gt;
&lt;br /&gt;
http://clutter-project.org/&lt;br /&gt;
&lt;br /&gt;
Clutter uses OpenGL (and optionally '''OpenGL ES''') for rendering but with an API which hides the underlying GL complexity from the developer. The Clutter API is intended to be easy to use, efficient and flexible.&lt;br /&gt;
&lt;br /&gt;
It does integrate gstreamer (for easy media playback, even camera or mic inputs), allows pango text rendering, cairo graphics rendering. Provided bindings are python, C# and Ruby.&lt;br /&gt;
&lt;br /&gt;
GTK off screen rendering is supposed to be on it's way; once it is here, there will be a possibility of using GTK apps directly within OpenGL apps as textures, which would lead to the possibility of creating a full OpenGL &amp;quot;application manager&amp;quot; (as well as media consuming app) with ZUI features.&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C, OpenGL&lt;br /&gt;
* Bindings: Python, C#, Ruby&lt;br /&gt;
* Backends: GLX / SDL / EGL&lt;br /&gt;
* Media support: Gstreamer integration, Cairo graphics rendering, Pango fonts rendering&lt;br /&gt;
* Embedding: GTK embedding&lt;br /&gt;
&lt;br /&gt;
====Graff====&lt;br /&gt;
&lt;br /&gt;
An early demonstration of Graff, which ''is a lighweight high-performance graphics rendering library.''&lt;br /&gt;
http://www.mdk.org.pl/articles/2007/04/23/chapter-1-in-which-we-meet-graff&lt;br /&gt;
&lt;br /&gt;
Be sure to check out this demo (scrolling list with inertia scrolling)&lt;br /&gt;
http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Of course it will remind you of Apple iPhone's UI. But this one runs in software mode on Nokia N770&amp;amp;800 already. The most notable part of Graff seems to be the inertia and physics integration in general.&lt;br /&gt;
&lt;br /&gt;
====Pigment API====&lt;br /&gt;
&lt;br /&gt;
Fluendo's (the Gstreamer guys) ''[https://core.fluendo.com/pigment/trac Pigment] is a Python library designed to easily build user interfaces with embedded multimedia. Its design allows to use it on several platforms, thanks to a plugin system allowing to choose the underlying graphical API. Pigment is the rendering engine of Elisa, the Fluendo Media Center project.''&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C OpenGL&lt;br /&gt;
* Bindings: Python&lt;br /&gt;
* Backends: DirectFB OpenGL&lt;br /&gt;
* Media playback integration: using Gstreamer&lt;br /&gt;
&lt;br /&gt;
====Choosing====&lt;br /&gt;
&lt;br /&gt;
Benchmarking will be needed. We have therefore to define a std testing application that would allow to compare alternatives. &lt;br /&gt;
&lt;br /&gt;
Some Clutter VS Pigment information: http://www.taimila.com/?q=node/14&lt;br /&gt;
&lt;br /&gt;
==Improvement ideas==&lt;br /&gt;
&lt;br /&gt;
Please add here any idea that seems of relevance.&lt;br /&gt;
&lt;br /&gt;
===Kinetic scrolling===&lt;br /&gt;
&lt;br /&gt;
====EDIT: demo now on the neo====&lt;br /&gt;
&lt;br /&gt;
Apparently the topics discussed here have found an echo in moko devs :)&lt;br /&gt;
&lt;br /&gt;
http://dominion.kabel.utwente.nl/koen/cms/kinetic-scrolling-on-the-neo1973&lt;br /&gt;
&lt;br /&gt;
enjoy the video demo; everything seems to be rendered software fine. More details about the implementation to come.&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
&lt;br /&gt;
Graff's inertia scrolling list example: http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Because an example is worth 1000s words...&lt;br /&gt;
&lt;br /&gt;
====Controls====&lt;br /&gt;
&lt;br /&gt;
* Sliding up/down = Single click + maintained for a minimal distance&lt;br /&gt;
&lt;br /&gt;
Effect: scroll in an inverted/negated fashion (slide down = scroll up, slide up = scroll down)&lt;br /&gt;
&lt;br /&gt;
When finger is released (i.e. touchscreen doesn't detect any press):&lt;br /&gt;
  if (last_speed_seen &amp;gt; 0 ) then keep this speed and acceleration, with friction&lt;br /&gt;
  else stop scrolling&lt;br /&gt;
&lt;br /&gt;
Scrolling here is seen as unidimensional, but can apply to bidimensional situations (ex: zoomed image) too&lt;br /&gt;
&lt;br /&gt;
* Action = quick double tap&lt;br /&gt;
&lt;br /&gt;
* Details/select = short single tap&lt;br /&gt;
&lt;br /&gt;
* Right click = long tap&lt;br /&gt;
&lt;br /&gt;
* Sliding left/right: switch sorting method&lt;br /&gt;
&lt;br /&gt;
====Parts to modify====&lt;br /&gt;
&lt;br /&gt;
''Having a scroll that isn't a 1:1 map to the user's action isn't hard. It's just an extra calculation in the scroll code.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;---- Where is the scroll code? :)&lt;br /&gt;
&lt;br /&gt;
* libmokoui&lt;br /&gt;
** [[Stylus_Scrolling | Stylus scrolling widget]]&lt;br /&gt;
** [[Finger_Scrolling | Finger scrolling wheel widget]]&lt;br /&gt;
* gtk&lt;br /&gt;
** [http://www.gtk.org/api/2.6/gtk/GtkVScrollbar.html GtkVScrollbar]&lt;br /&gt;
&lt;br /&gt;
The best would be to add the feature for both finger and stylus scrolling.&lt;br /&gt;
&lt;br /&gt;
TODO:&lt;br /&gt;
* make the entire list a &amp;quot;scrolling zone&amp;quot;, i.e. an overlay transparent scrolling widget?&lt;br /&gt;
* define controls&lt;br /&gt;
* add the inertia feature&lt;br /&gt;
&lt;br /&gt;
===1D Scrolling: inertia friction integration into openmoko's finger wheel=== &lt;br /&gt;
&lt;br /&gt;
The same, but for the wheel. It can be very short to do: you don't have 1:1 anymore, but, for example, 1/4 wheel turn = 1 item. It's demultiplicated, but has inertia.&lt;br /&gt;
&lt;br /&gt;
===Left-handed UI Support===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
A discussion on the community list identified a desire to have the ability to switch the OpenMoko UI into &amp;quot;left-handed&amp;quot; mode.  &lt;br /&gt;
&lt;br /&gt;
 The main problem is scrollbars, when they're on the right, dragging  &lt;br /&gt;
 the scrollbar left handed results in your hand covering the screen so  &lt;br /&gt;
 you can't see what you are doing. So having the option of scrollbars  &lt;br /&gt;
 on the left would be useful.&lt;br /&gt;
&lt;br /&gt;
 I don't think the whole screen should be mirrored! There are some elements&lt;br /&gt;
 that should remain..like the main top bar with the status icons and such.&lt;br /&gt;
 Scrollbars are the main thing I can think of right now.&lt;br /&gt;
&lt;br /&gt;
===Handgesture recognition proposals===&lt;br /&gt;
&lt;br /&gt;
====Using simple, localized warp as modifier key====&lt;br /&gt;
&lt;br /&gt;
As discussed on community list:&lt;br /&gt;
&lt;br /&gt;
  If you hold down one finger and tap the other one, the mouse pops over and back&lt;br /&gt;
  again. If you keep your second finger touching, the cursor follows it. When you&lt;br /&gt;
  release it, cursor goes back to first finger position. This could be a way to&lt;br /&gt;
  set a bounding box or turn on the mode. So the second finger can do something&lt;br /&gt;
  like rotating around the first, or increase or lower the distance to the first.&lt;br /&gt;
&lt;br /&gt;
* the so-called &amp;quot;first touch&amp;quot; can be done on the mokowheel zone itself: put your left thumb on the black area; if you touch the screen with another finger, there is a '''warp'''; the warp is detectable and allows to enter &amp;quot;fake multi-touchscreen mode&amp;quot;&lt;br /&gt;
* afterwards,&lt;br /&gt;
     * slide your right-hand finger down, it scrolls up&lt;br /&gt;
     * slide your right-hand finger up, it scrolls down&lt;br /&gt;
     * slide it left, next page/item&lt;br /&gt;
     * slide it right, previous page/item&lt;br /&gt;
     * do a circle: rotation&lt;br /&gt;
     * narrow towards the black circle: zoom -&lt;br /&gt;
     * go away: zoom +&lt;br /&gt;
* if you had kept your first finger on the black quarter circle, you can continue issuing other gestures&lt;br /&gt;
&lt;br /&gt;
The advantages of using simple origin-driven cursor warping as double touch detection criteria is that:&lt;br /&gt;
* you don't have to use the wheel as button, which would slow things down and generate errors (false button presses)&lt;br /&gt;
* simpler detection algorithms that can pass by the fluctuation due to pressure relative distribution&lt;br /&gt;
* the space taken by the wheel itself is &amp;quot;useless&amp;quot; (i.e. displays no information); using it as modifier allows to keep the screen clean for reading&lt;br /&gt;
* the origin of this zone lets use maximum surface of the screen, allowing more fine controlling&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_rotate_right.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_previous.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_down.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_zoom-.png]]&lt;br /&gt;
&lt;br /&gt;
*Pros:&lt;br /&gt;
** who said we need multi-touch hardware?&lt;br /&gt;
** this may be the easiest way (in terms of design/implementation complexity, reliability)&lt;br /&gt;
*Cons: &lt;br /&gt;
** no matter what we'll invent, we'll need two hands for on-the-move controlling&lt;br /&gt;
** what about left-handed people?&lt;br /&gt;
&lt;br /&gt;
====What is to modify ?====&lt;br /&gt;
&lt;br /&gt;
We need to emulate key presses. We need to work at a layer where we can get raw cursor coordinates. &amp;lt;---- X server layer?&lt;br /&gt;
&lt;br /&gt;
There is a fake keyboard module (for dev purposes) in the main kernel tree, which could be used to simulate keyboard presses (hence keeping keyboard-enabled apps unmodified).&lt;br /&gt;
&lt;br /&gt;
====Full multi-touch emulation====&lt;br /&gt;
&lt;br /&gt;
Doable, but tricky...&lt;br /&gt;
&lt;br /&gt;
==Preparing the multi touch==&lt;br /&gt;
&lt;br /&gt;
One day we might get multitouch devices. Let's get ready.&lt;br /&gt;
&lt;br /&gt;
===MPX===&lt;br /&gt;
 	&lt;br /&gt;
The Multi-Pointer X Server is a modification of the X server to support multiple mice and keyboards in X. It provides users with one cursor per device and one keyboard focus per keyboard. Each cursor can operate independently. MPX is the first multicursor windowing system and allows two-handed interaction with legacy applications, but also the creation of innovative applications and user interfaces. &lt;br /&gt;
&lt;br /&gt;
[http://wearables.unisa.edu.au/mpx/ The multipoint X server project]&lt;br /&gt;
&lt;br /&gt;
===MacSlow's Lowfat getting multitouched===&lt;br /&gt;
&lt;br /&gt;
http://dlai.jafu.dk/?p=1&lt;br /&gt;
&lt;br /&gt;
==Open questions==&lt;br /&gt;
&lt;br /&gt;
* will the neo/openmoko graphics system be powerful enough for such uses? I apple uses an OpenGL ES acceleration on this device (as well as on recent iPods), which is on the way with [[GTA02#.22Phase_2.22_.28GTA02.2C_.22Mass_Market.22.29|GTA02]].&lt;br /&gt;
* how does the touchscreen behave? We need a detailed touchscreen wiki information page, with visual traces. How hardware-specific is it?&lt;br /&gt;
* is multi touch really that awesome? I guess not.&lt;br /&gt;
&lt;br /&gt;
{{Languages|UI Improvements}}&lt;br /&gt;
&lt;br /&gt;
[[Category:User Interfaces| ]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/UI_Improvements</id>
		<title>UI Improvements</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/UI_Improvements"/>
				<updated>2007-07-31T16:34:51Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* 1D list scrolling: looped physics-driven item list */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
  Obviously the tools are in the wild to build interfaces that could rival&lt;br /&gt;
  (or better IMO) anything Apple comes up with. We just need to organize&lt;br /&gt;
  this stuff. This would need hardware that can support dynamic&lt;br /&gt;
  interfaces. I can help here, too.&lt;br /&gt;
  sean@openmoko.com&lt;br /&gt;
&lt;br /&gt;
In fact, this place shall be dedicated to human-machine interactions improvements discussion;&lt;br /&gt;
&lt;br /&gt;
Human-machine interaction can be separated into several aspects:&lt;br /&gt;
* the physical contact/input device: the mono-touch touchscreen&lt;br /&gt;
* the graphics: &lt;br /&gt;
** accelerated rendering can add more consistency to zooming user interfaces, which seem to be quite an interesting concept for embedded scrensize-limited devices&lt;br /&gt;
** adding physics &amp;quot;look and feel&amp;quot; to (ex: menu's) behaviours can add coherence too&lt;br /&gt;
* the input methods&lt;br /&gt;
** the virtual keyboard&lt;br /&gt;
** handgestures&lt;br /&gt;
&lt;br /&gt;
==Finding inspiration ...==&lt;br /&gt;
&lt;br /&gt;
===Seen Live===&lt;br /&gt;
&lt;br /&gt;
'''Multi-touch'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=89sz8ExZndc Multi-Touchscreen experiments video @youtube]&lt;br /&gt;
*[http://www.youtube.com/watch?v=nPqqfVLQ_qY iPhone UI features demo @youtube]&lt;br /&gt;
* Multi-touch on Linux with [http://www.youtube.com/watch?v=olWjnfBoY8E MPX]&lt;br /&gt;
&lt;br /&gt;
'''Zooming user interfaces'''&lt;br /&gt;
*[http://www.zenzui.com/products.html ZenZui], a [http://en.wikipedia.org/wiki/ZUI ZUI (zooming user interface)]&lt;br /&gt;
*[http://labs.live.com/Deepfish/videos.aspx Microsoft Bluefish's ZUI] (new mobile webbrowser)&lt;br /&gt;
*[http://googlesystem.blogspot.com/2007/04/opera-920-more-homepages-at-your.html Opera speed dial]&lt;br /&gt;
&lt;br /&gt;
'''Graphics'''&lt;br /&gt;
*[http://www.rasterman.com/files/eem.avi EEM], Rasterman's EFL libs on handelds proof of concept (doesn't DO anything, just showing off the EFLs on a handeld)&lt;br /&gt;
*[http://www.youtube.com/watch?v=8kLFPfaxQ6U&amp;amp;eurl= Nvidia's cutting-edge techno], an [http://www.khronos.org/openkode/ Openkode] demo&lt;br /&gt;
*[http://files.mdk.am/demos/graff-demo-3.avi Graff]'s inertia scroll list&lt;br /&gt;
&lt;br /&gt;
'''Science fiction'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=G_FS2TiK3AI UPMC Future?]&lt;br /&gt;
&lt;br /&gt;
'''Links:'''&lt;br /&gt;
*[http://elevate.sourceforge.net/links.html elevate project's links] sums up quite greatly the latest innovations in the desktop area&lt;br /&gt;
*[http://nooface.net/ Nooface] is a human-machine news site&lt;br /&gt;
*Asus-Intel's [http://www.hothardware.com/articles/Hands_on_with_the_ASUS_Eee/?page=2 Eee]'s interface&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===n-D navigation: the polyhedra inspiration===&lt;br /&gt;
&lt;br /&gt;
When we want to navigate files, mp3s in an mp3 player, etc... Every control that the application needs is a button. What about looking at the polyhedrons? We could find one for each usage, with as many surrounding subzones that may be used as controls. Ex: you need 5 buttons, let's take a pentagon with 5 surrounding zones all around. That way, it's always optimized...&lt;br /&gt;
&lt;br /&gt;
http://en.wikipedia.org/wiki/Polyhedra&lt;br /&gt;
http://en.wikipedia.org/wiki/List_of_uniform_polyhedra&lt;br /&gt;
&lt;br /&gt;
===Our weapons===&lt;br /&gt;
&lt;br /&gt;
We can't improve the human-machine interface without knowing the strengths / weaknesses of our hardware; some of the weaknesses might turn out as exploitable features, some strengths as limiting constraints.&lt;br /&gt;
&lt;br /&gt;
====The touchscreen====&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What exactly does the touchscreen see when  you touch the screen with 2 fingers&lt;br /&gt;
  at the same time, when you move them, when you move only one of the 2, etc. I'm &lt;br /&gt;
  also interested in knowing how precise the touchscreen is (ex: refresh rate, &lt;br /&gt;
  possible pressure indication, ...)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* The output is the center of the bounding box of the touched area&lt;br /&gt;
* The touch point skips instantly on double touch&lt;br /&gt;
* Pressure has almost no effect on a single touch, but not so on a double touch. The relative pressures will cause a significant skewing effect towards the harder touch. You can easily move the pointer along the line between your two fingers by changing the relative pressure.&lt;br /&gt;
&lt;br /&gt;
Conclusions:&lt;br /&gt;
* we can detect double touch as jumps, and that's all&lt;br /&gt;
* no pressure&lt;br /&gt;
* This could be an interesting input method for games - e.g. holding the Neo in landscape view, letting each thumb rest on a specific input area; probably needs to be checked for usability with a real device&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when sliding two fingers in parallel up(L,R)-&amp;gt;down(L,R)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see a slide along the center line between your two fingers. In practice, you can't keep the pressure equal, so you will see some kind of zig-zag line somewhere between the two pressure points in the direction of your slide.&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when narrowing two fingers in slide (=zoom effect on iphone)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see the pointer stay at the center of the zoom movement. In practice, you can't keep the pressure equal for both fingers, so the pointer will move towards one of the two pressure points.&lt;br /&gt;
&lt;br /&gt;
====Graphics and computational capabilities====&lt;br /&gt;
&lt;br /&gt;
It would be good to report what performance the current hardware allows:&lt;br /&gt;
* There was no pure X11 benchmarking done (AFAIK) (how many fps at full VGA scrolling, ex: 1024*480 image scrolling?)&lt;br /&gt;
* what about the lcd reactivity? What if we don't see anything but blur while moving items fast?&lt;br /&gt;
&lt;br /&gt;
Please report here your impressions.&lt;br /&gt;
&lt;br /&gt;
==Areas of improvement==&lt;br /&gt;
&lt;br /&gt;
* OpenGL for fluid zooming interfaces (2D: the infinite sphere model, 1D: the infinite wheel of fortune/ribbon model, exposé)&lt;br /&gt;
* HandGestures&lt;br /&gt;
* Physics-model based improvements: inertia and friction&lt;br /&gt;
* multi touch screen for natural handgestures &lt;br /&gt;
* improved virtual keyboard&lt;br /&gt;
* switching to another GUI toolkit (EFLs)&lt;br /&gt;
&lt;br /&gt;
===Physics-inspired animation a.k.a. &amp;quot;Digital Physics&amp;quot;===&lt;br /&gt;
&lt;br /&gt;
If we want to add eye candy &amp;amp; usability to the UI (such as smooth realistic list scrolling, as seen in apple's&lt;br /&gt;
iphone demo on contacts lists for instance), we'll need a physics engine, so that moves &amp;amp; animations aren't all linear.&lt;br /&gt;
&lt;br /&gt;
The following aticle explains the [http://www.readwriteweb.com/archives/the_physics_of_iphone.php Digital Physics] term from the iPhone example.&lt;br /&gt;
&lt;br /&gt;
The most used technique for calculating trajectories and systems of related geometrical objects seems to be [http://en.wikipedia.org/wiki/Verlet_integration verlet integration] implementation; it is an alternative to Euler's integration method, using fast approximation. &lt;br /&gt;
&lt;br /&gt;
We may have no need for such a mathematical method at first, but perhaps there are other use cases. For instance, it may be useful to gesture recognition (i'm not aware if existing gesture recognition engines measure speed, acceleration...).&lt;br /&gt;
&lt;br /&gt;
====Open Dynamics Engine====&lt;br /&gt;
&lt;br /&gt;
ODE is an open source, high performance library for simulating rigid body dynamics. It is fully featured, stable, mature and platform independent with an easy to use C/C++ API. It has advanced joint types and integrated collision detection with friction. ODE is useful for simulating vehicles, objects in virtual reality environments and virtual creatures. It is currently used in many computer games, 3D authoring tools and simulation tools.&lt;br /&gt;
&lt;br /&gt;
http://www.ode.org/&lt;br /&gt;
&lt;br /&gt;
====Libakamaru====&lt;br /&gt;
&lt;br /&gt;
The [http://people.freedesktop.org/~krh/akamaru.git/ akamaru library] is the code behind [http://www.youtube.com/watch?v=VekgyKQoTeM kiba dock]'s fun and dynamic behaviour. It's dependencies are light (needs just GLib). It takes elasticity, friction, gravity into account.&lt;br /&gt;
&lt;br /&gt;
If you want to take a quick look at the code:&lt;br /&gt;
svn co http://svn.kiba-dock.org/akamaru/ akamaru&lt;br /&gt;
&lt;br /&gt;
The only (AFAIK) application using this library is kiba-dock, a *fun* app launcher, but we may find another use to it in the future.&lt;br /&gt;
&lt;br /&gt;
As suggested on the mailing list, it is mostly overkill for the uses we intend to have, but this library may be optimized already, the API can spare some time for too. Furthermore, ''Qui peut le plus, peut le moins''.&lt;br /&gt;
&lt;br /&gt;
====Verlet integration implementation from e17====&lt;br /&gt;
&lt;br /&gt;
There's an undergoing verlet integration implementation into the e17 project (by rephorm) see http://rephorm.com/news/tag/physics , so we may see some UI physics integration into e17 someday.&lt;br /&gt;
&lt;br /&gt;
====Robert Pernner's easy equations====&lt;br /&gt;
&lt;br /&gt;
http://www.robertpenner.com/easing/&lt;br /&gt;
&lt;br /&gt;
See the demo: implements non linear behaviour (actionscript), but may give inspiration&lt;br /&gt;
&lt;br /&gt;
===Extending the touchscreen capabilities and input methods===&lt;br /&gt;
&lt;br /&gt;
* '''Multitouchscreen emulation'''&lt;br /&gt;
&lt;br /&gt;
If we got it right, when touching the screen on a second place, the cursor oscillates between the two points depending on relative pressure distribution. Using averaging algorithms, we may have the opportunity to detect peculiar behaviours.&lt;br /&gt;
&lt;br /&gt;
We need raw data (x,y,t) from the real hardware for the following behaviours:&lt;br /&gt;
* slide two fingers in parallel - vertical up/down (scroll)&lt;br /&gt;
* turn the two fingers around (rotate)&lt;br /&gt;
* slide two fingers towards each other (zoom-)&lt;br /&gt;
* slide two fingers apart (zoom+)&lt;br /&gt;
&lt;br /&gt;
When touching the screen with two fingers at the same time, we necessarily see the two points, or are able to extrapolate the position of the second one. This solution can add feature, but will probably be little erratic...&lt;br /&gt;
&lt;br /&gt;
* '''Touchscreen kernel module hacking'''&lt;br /&gt;
&lt;br /&gt;
We may correct the &amp;quot;half distance&amp;quot; phenomenon on double touch: if double touch is detected, then assimilate the cursor as twice further than the first touch. It would allow finer control, but higher instability.&lt;br /&gt;
&lt;br /&gt;
The double touch detection may be implemented in the driver itself, as well as stabilization.&lt;br /&gt;
&lt;br /&gt;
* '''Other detectable behaviours'''&lt;br /&gt;
&lt;br /&gt;
The warping can be used in the 4 diagonals, plus the up/down/right/left cross:&lt;br /&gt;
&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
  - 1            -  - 1          2 -  - 1            -  -      2       -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -             2-  -              -  - 2            -  -      1       -&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
&lt;br /&gt;
It's not double touch, but two sequential presses with a short time in between (~0.5 s)&lt;br /&gt;
&lt;br /&gt;
* '''Clever hacks'''&lt;br /&gt;
&lt;br /&gt;
It's been said that having no multitouch screen allows less freedom for innovation. Maybe we could get something out of our touchscreen drivers.&lt;br /&gt;
&lt;br /&gt;
Why ? Think of apple's scroll up/down feature on macbooks touchpads (which '''aren't multi touch''', it's a [http://iscroll2.sourceforge.net/ clever driver hack, iscroll2]):&lt;br /&gt;
&lt;br /&gt;
  To scroll, just place two fingers on your trackpad instead of one. Both fingers&lt;br /&gt;
  need to be placed next to each other horizontally (not vertically, the trackpad &lt;br /&gt;
  cannot detect that). Some people get better results with their finger spaced a&lt;br /&gt;
  little bit apart, while others prefer having the fingers right next to each other.&lt;br /&gt;
&lt;br /&gt;
  iScroll2 provides two scrolling modes: Linear and circular scrolling.&lt;br /&gt;
&lt;br /&gt;
  For linear scrolling, move the two fingers up/down or left/right in a straight &lt;br /&gt;
  line, respectively, to scroll in that direction.&lt;br /&gt;
&lt;br /&gt;
  Circular scrolling works in a way similar to the iPod's scroll wheel: Move the two&lt;br /&gt;
  fingers in a circle to scroll up or down, depending   on whether you move in a &lt;br /&gt;
  clockwise or counterclockwise direction.&lt;br /&gt;
&lt;br /&gt;
Maybe we can port/adapt/get inspiration from this macintosh driver.&lt;br /&gt;
&lt;br /&gt;
===Improved virtual keyboard===&lt;br /&gt;
&lt;br /&gt;
One nice idea for virtual input is [http://www.micropp.se/openmoko/ finger-splash]&lt;br /&gt;
&lt;br /&gt;
Yet, optimization does not only apply to the plain one-letter-at-a-time input. We need some sort of T9 (dictionary-based input help). When typing a word, the first letter determines the next possible ones. Therefore, we may let disappear the less-probable following letters. Ex: type an L, there's no way an X follows...&lt;br /&gt;
&lt;br /&gt;
Hints: &lt;br /&gt;
* ZIP's huffmann compression applied to SMSs/mails for detecting the most used characters/words/sentences.&lt;br /&gt;
* html tag-clouds, one-letter tag clouds ; font size proportional to the probability of being used&lt;br /&gt;
&lt;br /&gt;
The most critical point is the initial disposition of the letters, before any letter is typed. We may also want to use horizontal two-parts keyboard (with the neo in hands like a psp..)&lt;br /&gt;
&lt;br /&gt;
The [http://www.strout.net/info/ideas/hexinput.html hexinput] concept is interesting. What about hiding the less probable letters and increasing the remaining ones during typing?&lt;br /&gt;
&lt;br /&gt;
===Towards OpenGL compositing===&lt;br /&gt;
&lt;br /&gt;
There are [http://www.hbmobile.org/wiki/index.php?title=GUI_Frameworks lots of possible GUI frameworks] with various software architectures that could be used for OpenMoko.&lt;br /&gt;
&lt;br /&gt;
GTA01 hardware uses GTK+/matchbox without hardware acceleration, and it's not enough: this is a first that a mobile Linux device has such a high DPI resolution. OpenGL ES compositing seems to have a bright future on embedded devices, because compositing seems to give natural zooming interfaces reality (at last!).&lt;br /&gt;
&lt;br /&gt;
Considering recent changes in destkop applications, opengl has a definite future. For instance, the expose (be it apple's or beryl's) is a very interesting and usable feature. Using compositing allows the physics metaphore: '''the human brain doesn't like &amp;quot;gaps&amp;quot;/jumps (for instance while scrolling a text), it needs continuity''', which can be provided by opengl. When you look at apple's iphone prototype, it's not just eye candy, it's maybe the most natural/human way of navigating, because it's sufficiently realistic for the brain to forget the non-physical nature of what's inside.&lt;br /&gt;
&lt;br /&gt;
So, opengl hardware will be needed in a more or less distant hardware, for 100% fluid operation. Benchmarking will be needed to compare the different alternatives that are cited further.&lt;br /&gt;
&lt;br /&gt;
====The Enlightenment Foundation Libraries====&lt;br /&gt;
&lt;br /&gt;
EFL's Evas is a powerful and power sparing canvas drawing library. It can be OpenGL accelerated. Python/Ruby bindings are available in the &amp;quot;proto&amp;quot; e17 cvs folder.&lt;br /&gt;
&lt;br /&gt;
''Moved [[E17|here]]''&lt;br /&gt;
&lt;br /&gt;
====Clutter Toolkit====&lt;br /&gt;
&lt;br /&gt;
Clutter, an [http://o-hand.com/ OpenedHand] project, is an open source software library for creating fast, visually rich graphical user interfaces. The most obvious example of potential usage is in media center type applications.&lt;br /&gt;
&lt;br /&gt;
http://clutter-project.org/&lt;br /&gt;
&lt;br /&gt;
Clutter uses OpenGL (and optionally '''OpenGL ES''') for rendering but with an API which hides the underlying GL complexity from the developer. The Clutter API is intended to be easy to use, efficient and flexible.&lt;br /&gt;
&lt;br /&gt;
It does integrate gstreamer (for easy media playback, even camera or mic inputs), allows pango text rendering, cairo graphics rendering. Provided bindings are python, C# and Ruby.&lt;br /&gt;
&lt;br /&gt;
GTK off screen rendering is supposed to be on it's way; once it is here, there will be a possibility of using GTK apps directly within OpenGL apps as textures, which would lead to the possibility of creating a full OpenGL &amp;quot;application manager&amp;quot; (as well as media consuming app) with ZUI features.&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C, OpenGL&lt;br /&gt;
* Bindings: Python, C#, Ruby&lt;br /&gt;
* Backends: GLX / SDL / EGL&lt;br /&gt;
* Media support: Gstreamer integration, Cairo graphics rendering, Pango fonts rendering&lt;br /&gt;
* Embedding: GTK embedding&lt;br /&gt;
&lt;br /&gt;
====Graff====&lt;br /&gt;
&lt;br /&gt;
An early demonstration of Graff, which ''is a lighweight high-performance graphics rendering library.''&lt;br /&gt;
http://www.mdk.org.pl/articles/2007/04/23/chapter-1-in-which-we-meet-graff&lt;br /&gt;
&lt;br /&gt;
Be sure to check out this demo (scrolling list with inertia scrolling)&lt;br /&gt;
http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Of course it will remind you of Apple iPhone's UI. But this one runs in software mode on Nokia N770&amp;amp;800 already. The most notable part of Graff seems to be the inertia and physics integration in general.&lt;br /&gt;
&lt;br /&gt;
====Pigment API====&lt;br /&gt;
&lt;br /&gt;
Fluendo's (the Gstreamer guys) ''[https://core.fluendo.com/pigment/trac Pigment] is a Python library designed to easily build user interfaces with embedded multimedia. Its design allows to use it on several platforms, thanks to a plugin system allowing to choose the underlying graphical API. Pigment is the rendering engine of Elisa, the Fluendo Media Center project.''&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C OpenGL&lt;br /&gt;
* Bindings: Python&lt;br /&gt;
* Backends: DirectFB OpenGL&lt;br /&gt;
* Media playback integration: using Gstreamer&lt;br /&gt;
&lt;br /&gt;
====Choosing====&lt;br /&gt;
&lt;br /&gt;
Benchmarking will be needed. We have therefore to define a std testing application that would allow to compare alternatives. &lt;br /&gt;
&lt;br /&gt;
Some Clutter VS Pigment information: http://www.taimila.com/?q=node/14&lt;br /&gt;
&lt;br /&gt;
==Improvement ideas==&lt;br /&gt;
&lt;br /&gt;
Please add here any idea that seems of relevance.&lt;br /&gt;
&lt;br /&gt;
===kinetic scrolling===&lt;br /&gt;
&lt;br /&gt;
====EDIT: demo now on the neo====&lt;br /&gt;
&lt;br /&gt;
Apparently the topics discussed here have found an echo in moko devs :)&lt;br /&gt;
&lt;br /&gt;
http://dominion.kabel.utwente.nl/koen/cms/kinetic-scrolling-on-the-neo1973&lt;br /&gt;
&lt;br /&gt;
enjoy the video demo; everything seems to be rendered software fine. More details about the implementation to come.&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
&lt;br /&gt;
Graff's inertia scrolling list example: http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Because an example is worth 1000s words...&lt;br /&gt;
&lt;br /&gt;
====Controls====&lt;br /&gt;
&lt;br /&gt;
* Sliding up/down = Single click + maintained for a minimal distance&lt;br /&gt;
&lt;br /&gt;
Effect: scroll in an inverted/negated fashion (slide down = scroll up, slide up = scroll down)&lt;br /&gt;
&lt;br /&gt;
When finger is released (i.e. touchscreen doesn't detect any press):&lt;br /&gt;
  if (last_speed_seen &amp;gt; 0 ) then keep this speed and acceleration, with friction&lt;br /&gt;
  else stop scrolling&lt;br /&gt;
&lt;br /&gt;
Scrolling here is seen as unidimensional, but can apply to bidimensional situations (ex: zoomed image) too&lt;br /&gt;
&lt;br /&gt;
* Action = quick double tap&lt;br /&gt;
&lt;br /&gt;
* Details/select = short single tap&lt;br /&gt;
&lt;br /&gt;
* Right click = long tap&lt;br /&gt;
&lt;br /&gt;
* Sliding left/right: switch sorting method&lt;br /&gt;
&lt;br /&gt;
====Parts to modify====&lt;br /&gt;
&lt;br /&gt;
''Having a scroll that isn't a 1:1 map to the user's action isn't hard. It's just an extra calculation in the scroll code.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;---- Where is the scroll code? :)&lt;br /&gt;
&lt;br /&gt;
* libmokoui&lt;br /&gt;
** [[Stylus_Scrolling | Stylus scrolling widget]]&lt;br /&gt;
** [[Finger_Scrolling | Finger scrolling wheel widget]]&lt;br /&gt;
* gtk&lt;br /&gt;
** [http://www.gtk.org/api/2.6/gtk/GtkVScrollbar.html GtkVScrollbar]&lt;br /&gt;
&lt;br /&gt;
The best would be to add the feature for both finger and stylus scrolling.&lt;br /&gt;
&lt;br /&gt;
TODO:&lt;br /&gt;
* make the entire list a &amp;quot;scrolling zone&amp;quot;, i.e. an overlay transparent scrolling widget?&lt;br /&gt;
* define controls&lt;br /&gt;
* add the inertia feature&lt;br /&gt;
&lt;br /&gt;
===1D Scrolling: inertia friction integration into openmoko's finger wheel=== &lt;br /&gt;
&lt;br /&gt;
The same, but for the wheel. It can be very short to do: you don't have 1:1 anymore, but, for example, 1/4 wheel turn = 1 item. It's demultiplicated, but has inertia.&lt;br /&gt;
&lt;br /&gt;
===Left-handed UI Support===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
A discussion on the community list identified a desire to have the ability to switch the OpenMoko UI into &amp;quot;left-handed&amp;quot; mode.  &lt;br /&gt;
&lt;br /&gt;
 The main problem is scrollbars, when they're on the right, dragging  &lt;br /&gt;
 the scrollbar left handed results in your hand covering the screen so  &lt;br /&gt;
 you can't see what you are doing. So having the option of scrollbars  &lt;br /&gt;
 on the left would be useful.&lt;br /&gt;
&lt;br /&gt;
 I don't think the whole screen should be mirrored! There are some elements&lt;br /&gt;
 that should remain..like the main top bar with the status icons and such.&lt;br /&gt;
 Scrollbars are the main thing I can think of right now.&lt;br /&gt;
&lt;br /&gt;
===Handgesture recognition proposals===&lt;br /&gt;
&lt;br /&gt;
====Using simple, localized warp as modifier key====&lt;br /&gt;
&lt;br /&gt;
As discussed on community list:&lt;br /&gt;
&lt;br /&gt;
  If you hold down one finger and tap the other one, the mouse pops over and back&lt;br /&gt;
  again. If you keep your second finger touching, the cursor follows it. When you&lt;br /&gt;
  release it, cursor goes back to first finger position. This could be a way to&lt;br /&gt;
  set a bounding box or turn on the mode. So the second finger can do something&lt;br /&gt;
  like rotating around the first, or increase or lower the distance to the first.&lt;br /&gt;
&lt;br /&gt;
* the so-called &amp;quot;first touch&amp;quot; can be done on the mokowheel zone itself: put your left thumb on the black area; if you touch the screen with another finger, there is a '''warp'''; the warp is detectable and allows to enter &amp;quot;fake multi-touchscreen mode&amp;quot;&lt;br /&gt;
* afterwards,&lt;br /&gt;
     * slide your right-hand finger down, it scrolls up&lt;br /&gt;
     * slide your right-hand finger up, it scrolls down&lt;br /&gt;
     * slide it left, next page/item&lt;br /&gt;
     * slide it right, previous page/item&lt;br /&gt;
     * do a circle: rotation&lt;br /&gt;
     * narrow towards the black circle: zoom -&lt;br /&gt;
     * go away: zoom +&lt;br /&gt;
* if you had kept your first finger on the black quarter circle, you can continue issuing other gestures&lt;br /&gt;
&lt;br /&gt;
The advantages of using simple origin-driven cursor warping as double touch detection criteria is that:&lt;br /&gt;
* you don't have to use the wheel as button, which would slow things down and generate errors (false button presses)&lt;br /&gt;
* simpler detection algorithms that can pass by the fluctuation due to pressure relative distribution&lt;br /&gt;
* the space taken by the wheel itself is &amp;quot;useless&amp;quot; (i.e. displays no information); using it as modifier allows to keep the screen clean for reading&lt;br /&gt;
* the origin of this zone lets use maximum surface of the screen, allowing more fine controlling&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_rotate_right.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_previous.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_down.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_zoom-.png]]&lt;br /&gt;
&lt;br /&gt;
*Pros:&lt;br /&gt;
** who said we need multi-touch hardware?&lt;br /&gt;
** this may be the easiest way (in terms of design/implementation complexity, reliability)&lt;br /&gt;
*Cons: &lt;br /&gt;
** no matter what we'll invent, we'll need two hands for on-the-move controlling&lt;br /&gt;
** what about left-handed people?&lt;br /&gt;
&lt;br /&gt;
====What is to modify ?====&lt;br /&gt;
&lt;br /&gt;
We need to emulate key presses. We need to work at a layer where we can get raw cursor coordinates. &amp;lt;---- X server layer?&lt;br /&gt;
&lt;br /&gt;
There is a fake keyboard module (for dev purposes) in the main kernel tree, which could be used to simulate keyboard presses (hence keeping keyboard-enabled apps unmodified).&lt;br /&gt;
&lt;br /&gt;
====Full multi-touch emulation====&lt;br /&gt;
&lt;br /&gt;
Doable, but tricky...&lt;br /&gt;
&lt;br /&gt;
==Preparing the multi touch==&lt;br /&gt;
&lt;br /&gt;
One day we might get multitouch devices. Let's get ready.&lt;br /&gt;
&lt;br /&gt;
===MPX===&lt;br /&gt;
 	&lt;br /&gt;
The Multi-Pointer X Server is a modification of the X server to support multiple mice and keyboards in X. It provides users with one cursor per device and one keyboard focus per keyboard. Each cursor can operate independently. MPX is the first multicursor windowing system and allows two-handed interaction with legacy applications, but also the creation of innovative applications and user interfaces. &lt;br /&gt;
&lt;br /&gt;
[http://wearables.unisa.edu.au/mpx/ The multipoint X server project]&lt;br /&gt;
&lt;br /&gt;
===MacSlow's Lowfat getting multitouched===&lt;br /&gt;
&lt;br /&gt;
http://dlai.jafu.dk/?p=1&lt;br /&gt;
&lt;br /&gt;
==Open questions==&lt;br /&gt;
&lt;br /&gt;
* will the neo/openmoko graphics system be powerful enough for such uses? I apple uses an OpenGL ES acceleration on this device (as well as on recent iPods), which is on the way with [[GTA02#.22Phase_2.22_.28GTA02.2C_.22Mass_Market.22.29|GTA02]].&lt;br /&gt;
* how does the touchscreen behave? We need a detailed touchscreen wiki information page, with visual traces. How hardware-specific is it?&lt;br /&gt;
* is multi touch really that awesome? I guess not.&lt;br /&gt;
&lt;br /&gt;
{{Languages|UI Improvements}}&lt;br /&gt;
&lt;br /&gt;
[[Category:User Interfaces| ]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/UI_Improvements</id>
		<title>UI Improvements</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/UI_Improvements"/>
				<updated>2007-07-31T16:32:27Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* 1D list scrolling: looped physics-driven item list */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
  Obviously the tools are in the wild to build interfaces that could rival&lt;br /&gt;
  (or better IMO) anything Apple comes up with. We just need to organize&lt;br /&gt;
  this stuff. This would need hardware that can support dynamic&lt;br /&gt;
  interfaces. I can help here, too.&lt;br /&gt;
  sean@openmoko.com&lt;br /&gt;
&lt;br /&gt;
In fact, this place shall be dedicated to human-machine interactions improvements discussion;&lt;br /&gt;
&lt;br /&gt;
Human-machine interaction can be separated into several aspects:&lt;br /&gt;
* the physical contact/input device: the mono-touch touchscreen&lt;br /&gt;
* the graphics: &lt;br /&gt;
** accelerated rendering can add more consistency to zooming user interfaces, which seem to be quite an interesting concept for embedded scrensize-limited devices&lt;br /&gt;
** adding physics &amp;quot;look and feel&amp;quot; to (ex: menu's) behaviours can add coherence too&lt;br /&gt;
* the input methods&lt;br /&gt;
** the virtual keyboard&lt;br /&gt;
** handgestures&lt;br /&gt;
&lt;br /&gt;
==Finding inspiration ...==&lt;br /&gt;
&lt;br /&gt;
===Seen Live===&lt;br /&gt;
&lt;br /&gt;
'''Multi-touch'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=89sz8ExZndc Multi-Touchscreen experiments video @youtube]&lt;br /&gt;
*[http://www.youtube.com/watch?v=nPqqfVLQ_qY iPhone UI features demo @youtube]&lt;br /&gt;
* Multi-touch on Linux with [http://www.youtube.com/watch?v=olWjnfBoY8E MPX]&lt;br /&gt;
&lt;br /&gt;
'''Zooming user interfaces'''&lt;br /&gt;
*[http://www.zenzui.com/products.html ZenZui], a [http://en.wikipedia.org/wiki/ZUI ZUI (zooming user interface)]&lt;br /&gt;
*[http://labs.live.com/Deepfish/videos.aspx Microsoft Bluefish's ZUI] (new mobile webbrowser)&lt;br /&gt;
*[http://googlesystem.blogspot.com/2007/04/opera-920-more-homepages-at-your.html Opera speed dial]&lt;br /&gt;
&lt;br /&gt;
'''Graphics'''&lt;br /&gt;
*[http://www.rasterman.com/files/eem.avi EEM], Rasterman's EFL libs on handelds proof of concept (doesn't DO anything, just showing off the EFLs on a handeld)&lt;br /&gt;
*[http://www.youtube.com/watch?v=8kLFPfaxQ6U&amp;amp;eurl= Nvidia's cutting-edge techno], an [http://www.khronos.org/openkode/ Openkode] demo&lt;br /&gt;
*[http://files.mdk.am/demos/graff-demo-3.avi Graff]'s inertia scroll list&lt;br /&gt;
&lt;br /&gt;
'''Science fiction'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=G_FS2TiK3AI UPMC Future?]&lt;br /&gt;
&lt;br /&gt;
'''Links:'''&lt;br /&gt;
*[http://elevate.sourceforge.net/links.html elevate project's links] sums up quite greatly the latest innovations in the desktop area&lt;br /&gt;
*[http://nooface.net/ Nooface] is a human-machine news site&lt;br /&gt;
*Asus-Intel's [http://www.hothardware.com/articles/Hands_on_with_the_ASUS_Eee/?page=2 Eee]'s interface&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===n-D navigation: the polyhedra inspiration===&lt;br /&gt;
&lt;br /&gt;
When we want to navigate files, mp3s in an mp3 player, etc... Every control that the application needs is a button. What about looking at the polyhedrons? We could find one for each usage, with as many surrounding subzones that may be used as controls. Ex: you need 5 buttons, let's take a pentagon with 5 surrounding zones all around. That way, it's always optimized...&lt;br /&gt;
&lt;br /&gt;
http://en.wikipedia.org/wiki/Polyhedra&lt;br /&gt;
http://en.wikipedia.org/wiki/List_of_uniform_polyhedra&lt;br /&gt;
&lt;br /&gt;
===Our weapons===&lt;br /&gt;
&lt;br /&gt;
We can't improve the human-machine interface without knowing the strengths / weaknesses of our hardware; some of the weaknesses might turn out as exploitable features, some strengths as limiting constraints.&lt;br /&gt;
&lt;br /&gt;
====The touchscreen====&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What exactly does the touchscreen see when  you touch the screen with 2 fingers&lt;br /&gt;
  at the same time, when you move them, when you move only one of the 2, etc. I'm &lt;br /&gt;
  also interested in knowing how precise the touchscreen is (ex: refresh rate, &lt;br /&gt;
  possible pressure indication, ...)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* The output is the center of the bounding box of the touched area&lt;br /&gt;
* The touch point skips instantly on double touch&lt;br /&gt;
* Pressure has almost no effect on a single touch, but not so on a double touch. The relative pressures will cause a significant skewing effect towards the harder touch. You can easily move the pointer along the line between your two fingers by changing the relative pressure.&lt;br /&gt;
&lt;br /&gt;
Conclusions:&lt;br /&gt;
* we can detect double touch as jumps, and that's all&lt;br /&gt;
* no pressure&lt;br /&gt;
* This could be an interesting input method for games - e.g. holding the Neo in landscape view, letting each thumb rest on a specific input area; probably needs to be checked for usability with a real device&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when sliding two fingers in parallel up(L,R)-&amp;gt;down(L,R)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see a slide along the center line between your two fingers. In practice, you can't keep the pressure equal, so you will see some kind of zig-zag line somewhere between the two pressure points in the direction of your slide.&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when narrowing two fingers in slide (=zoom effect on iphone)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see the pointer stay at the center of the zoom movement. In practice, you can't keep the pressure equal for both fingers, so the pointer will move towards one of the two pressure points.&lt;br /&gt;
&lt;br /&gt;
====Graphics and computational capabilities====&lt;br /&gt;
&lt;br /&gt;
It would be good to report what performance the current hardware allows:&lt;br /&gt;
* There was no pure X11 benchmarking done (AFAIK) (how many fps at full VGA scrolling, ex: 1024*480 image scrolling?)&lt;br /&gt;
* what about the lcd reactivity? What if we don't see anything but blur while moving items fast?&lt;br /&gt;
&lt;br /&gt;
Please report here your impressions.&lt;br /&gt;
&lt;br /&gt;
==Areas of improvement==&lt;br /&gt;
&lt;br /&gt;
* OpenGL for fluid zooming interfaces (2D: the infinite sphere model, 1D: the infinite wheel of fortune/ribbon model, exposé)&lt;br /&gt;
* HandGestures&lt;br /&gt;
* Physics-model based improvements: inertia and friction&lt;br /&gt;
* multi touch screen for natural handgestures &lt;br /&gt;
* improved virtual keyboard&lt;br /&gt;
* switching to another GUI toolkit (EFLs)&lt;br /&gt;
&lt;br /&gt;
===Physics-inspired animation a.k.a. &amp;quot;Digital Physics&amp;quot;===&lt;br /&gt;
&lt;br /&gt;
If we want to add eye candy &amp;amp; usability to the UI (such as smooth realistic list scrolling, as seen in apple's&lt;br /&gt;
iphone demo on contacts lists for instance), we'll need a physics engine, so that moves &amp;amp; animations aren't all linear.&lt;br /&gt;
&lt;br /&gt;
The following aticle explains the [http://www.readwriteweb.com/archives/the_physics_of_iphone.php Digital Physics] term from the iPhone example.&lt;br /&gt;
&lt;br /&gt;
The most used technique for calculating trajectories and systems of related geometrical objects seems to be [http://en.wikipedia.org/wiki/Verlet_integration verlet integration] implementation; it is an alternative to Euler's integration method, using fast approximation. &lt;br /&gt;
&lt;br /&gt;
We may have no need for such a mathematical method at first, but perhaps there are other use cases. For instance, it may be useful to gesture recognition (i'm not aware if existing gesture recognition engines measure speed, acceleration...).&lt;br /&gt;
&lt;br /&gt;
====Open Dynamics Engine====&lt;br /&gt;
&lt;br /&gt;
ODE is an open source, high performance library for simulating rigid body dynamics. It is fully featured, stable, mature and platform independent with an easy to use C/C++ API. It has advanced joint types and integrated collision detection with friction. ODE is useful for simulating vehicles, objects in virtual reality environments and virtual creatures. It is currently used in many computer games, 3D authoring tools and simulation tools.&lt;br /&gt;
&lt;br /&gt;
http://www.ode.org/&lt;br /&gt;
&lt;br /&gt;
====Libakamaru====&lt;br /&gt;
&lt;br /&gt;
The [http://people.freedesktop.org/~krh/akamaru.git/ akamaru library] is the code behind [http://www.youtube.com/watch?v=VekgyKQoTeM kiba dock]'s fun and dynamic behaviour. It's dependencies are light (needs just GLib). It takes elasticity, friction, gravity into account.&lt;br /&gt;
&lt;br /&gt;
If you want to take a quick look at the code:&lt;br /&gt;
svn co http://svn.kiba-dock.org/akamaru/ akamaru&lt;br /&gt;
&lt;br /&gt;
The only (AFAIK) application using this library is kiba-dock, a *fun* app launcher, but we may find another use to it in the future.&lt;br /&gt;
&lt;br /&gt;
As suggested on the mailing list, it is mostly overkill for the uses we intend to have, but this library may be optimized already, the API can spare some time for too. Furthermore, ''Qui peut le plus, peut le moins''.&lt;br /&gt;
&lt;br /&gt;
====Verlet integration implementation from e17====&lt;br /&gt;
&lt;br /&gt;
There's an undergoing verlet integration implementation into the e17 project (by rephorm) see http://rephorm.com/news/tag/physics , so we may see some UI physics integration into e17 someday.&lt;br /&gt;
&lt;br /&gt;
====Robert Pernner's easy equations====&lt;br /&gt;
&lt;br /&gt;
http://www.robertpenner.com/easing/&lt;br /&gt;
&lt;br /&gt;
See the demo: implements non linear behaviour (actionscript), but may give inspiration&lt;br /&gt;
&lt;br /&gt;
===Extending the touchscreen capabilities and input methods===&lt;br /&gt;
&lt;br /&gt;
* '''Multitouchscreen emulation'''&lt;br /&gt;
&lt;br /&gt;
If we got it right, when touching the screen on a second place, the cursor oscillates between the two points depending on relative pressure distribution. Using averaging algorithms, we may have the opportunity to detect peculiar behaviours.&lt;br /&gt;
&lt;br /&gt;
We need raw data (x,y,t) from the real hardware for the following behaviours:&lt;br /&gt;
* slide two fingers in parallel - vertical up/down (scroll)&lt;br /&gt;
* turn the two fingers around (rotate)&lt;br /&gt;
* slide two fingers towards each other (zoom-)&lt;br /&gt;
* slide two fingers apart (zoom+)&lt;br /&gt;
&lt;br /&gt;
When touching the screen with two fingers at the same time, we necessarily see the two points, or are able to extrapolate the position of the second one. This solution can add feature, but will probably be little erratic...&lt;br /&gt;
&lt;br /&gt;
* '''Touchscreen kernel module hacking'''&lt;br /&gt;
&lt;br /&gt;
We may correct the &amp;quot;half distance&amp;quot; phenomenon on double touch: if double touch is detected, then assimilate the cursor as twice further than the first touch. It would allow finer control, but higher instability.&lt;br /&gt;
&lt;br /&gt;
The double touch detection may be implemented in the driver itself, as well as stabilization.&lt;br /&gt;
&lt;br /&gt;
* '''Other detectable behaviours'''&lt;br /&gt;
&lt;br /&gt;
The warping can be used in the 4 diagonals, plus the up/down/right/left cross:&lt;br /&gt;
&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
  - 1            -  - 1          2 -  - 1            -  -      2       -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -             2-  -              -  - 2            -  -      1       -&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
&lt;br /&gt;
It's not double touch, but two sequential presses with a short time in between (~0.5 s)&lt;br /&gt;
&lt;br /&gt;
* '''Clever hacks'''&lt;br /&gt;
&lt;br /&gt;
It's been said that having no multitouch screen allows less freedom for innovation. Maybe we could get something out of our touchscreen drivers.&lt;br /&gt;
&lt;br /&gt;
Why ? Think of apple's scroll up/down feature on macbooks touchpads (which '''aren't multi touch''', it's a [http://iscroll2.sourceforge.net/ clever driver hack, iscroll2]):&lt;br /&gt;
&lt;br /&gt;
  To scroll, just place two fingers on your trackpad instead of one. Both fingers&lt;br /&gt;
  need to be placed next to each other horizontally (not vertically, the trackpad &lt;br /&gt;
  cannot detect that). Some people get better results with their finger spaced a&lt;br /&gt;
  little bit apart, while others prefer having the fingers right next to each other.&lt;br /&gt;
&lt;br /&gt;
  iScroll2 provides two scrolling modes: Linear and circular scrolling.&lt;br /&gt;
&lt;br /&gt;
  For linear scrolling, move the two fingers up/down or left/right in a straight &lt;br /&gt;
  line, respectively, to scroll in that direction.&lt;br /&gt;
&lt;br /&gt;
  Circular scrolling works in a way similar to the iPod's scroll wheel: Move the two&lt;br /&gt;
  fingers in a circle to scroll up or down, depending   on whether you move in a &lt;br /&gt;
  clockwise or counterclockwise direction.&lt;br /&gt;
&lt;br /&gt;
Maybe we can port/adapt/get inspiration from this macintosh driver.&lt;br /&gt;
&lt;br /&gt;
===Improved virtual keyboard===&lt;br /&gt;
&lt;br /&gt;
One nice idea for virtual input is [http://www.micropp.se/openmoko/ finger-splash]&lt;br /&gt;
&lt;br /&gt;
Yet, optimization does not only apply to the plain one-letter-at-a-time input. We need some sort of T9 (dictionary-based input help). When typing a word, the first letter determines the next possible ones. Therefore, we may let disappear the less-probable following letters. Ex: type an L, there's no way an X follows...&lt;br /&gt;
&lt;br /&gt;
Hints: &lt;br /&gt;
* ZIP's huffmann compression applied to SMSs/mails for detecting the most used characters/words/sentences.&lt;br /&gt;
* html tag-clouds, one-letter tag clouds ; font size proportional to the probability of being used&lt;br /&gt;
&lt;br /&gt;
The most critical point is the initial disposition of the letters, before any letter is typed. We may also want to use horizontal two-parts keyboard (with the neo in hands like a psp..)&lt;br /&gt;
&lt;br /&gt;
The [http://www.strout.net/info/ideas/hexinput.html hexinput] concept is interesting. What about hiding the less probable letters and increasing the remaining ones during typing?&lt;br /&gt;
&lt;br /&gt;
===Towards OpenGL compositing===&lt;br /&gt;
&lt;br /&gt;
There are [http://www.hbmobile.org/wiki/index.php?title=GUI_Frameworks lots of possible GUI frameworks] with various software architectures that could be used for OpenMoko.&lt;br /&gt;
&lt;br /&gt;
GTA01 hardware uses GTK+/matchbox without hardware acceleration, and it's not enough: this is a first that a mobile Linux device has such a high DPI resolution. OpenGL ES compositing seems to have a bright future on embedded devices, because compositing seems to give natural zooming interfaces reality (at last!).&lt;br /&gt;
&lt;br /&gt;
Considering recent changes in destkop applications, opengl has a definite future. For instance, the expose (be it apple's or beryl's) is a very interesting and usable feature. Using compositing allows the physics metaphore: '''the human brain doesn't like &amp;quot;gaps&amp;quot;/jumps (for instance while scrolling a text), it needs continuity''', which can be provided by opengl. When you look at apple's iphone prototype, it's not just eye candy, it's maybe the most natural/human way of navigating, because it's sufficiently realistic for the brain to forget the non-physical nature of what's inside.&lt;br /&gt;
&lt;br /&gt;
So, opengl hardware will be needed in a more or less distant hardware, for 100% fluid operation. Benchmarking will be needed to compare the different alternatives that are cited further.&lt;br /&gt;
&lt;br /&gt;
====The Enlightenment Foundation Libraries====&lt;br /&gt;
&lt;br /&gt;
EFL's Evas is a powerful and power sparing canvas drawing library. It can be OpenGL accelerated. Python/Ruby bindings are available in the &amp;quot;proto&amp;quot; e17 cvs folder.&lt;br /&gt;
&lt;br /&gt;
''Moved [[E17|here]]''&lt;br /&gt;
&lt;br /&gt;
====Clutter Toolkit====&lt;br /&gt;
&lt;br /&gt;
Clutter, an [http://o-hand.com/ OpenedHand] project, is an open source software library for creating fast, visually rich graphical user interfaces. The most obvious example of potential usage is in media center type applications.&lt;br /&gt;
&lt;br /&gt;
http://clutter-project.org/&lt;br /&gt;
&lt;br /&gt;
Clutter uses OpenGL (and optionally '''OpenGL ES''') for rendering but with an API which hides the underlying GL complexity from the developer. The Clutter API is intended to be easy to use, efficient and flexible.&lt;br /&gt;
&lt;br /&gt;
It does integrate gstreamer (for easy media playback, even camera or mic inputs), allows pango text rendering, cairo graphics rendering. Provided bindings are python, C# and Ruby.&lt;br /&gt;
&lt;br /&gt;
GTK off screen rendering is supposed to be on it's way; once it is here, there will be a possibility of using GTK apps directly within OpenGL apps as textures, which would lead to the possibility of creating a full OpenGL &amp;quot;application manager&amp;quot; (as well as media consuming app) with ZUI features.&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C, OpenGL&lt;br /&gt;
* Bindings: Python, C#, Ruby&lt;br /&gt;
* Backends: GLX / SDL / EGL&lt;br /&gt;
* Media support: Gstreamer integration, Cairo graphics rendering, Pango fonts rendering&lt;br /&gt;
* Embedding: GTK embedding&lt;br /&gt;
&lt;br /&gt;
====Graff====&lt;br /&gt;
&lt;br /&gt;
An early demonstration of Graff, which ''is a lighweight high-performance graphics rendering library.''&lt;br /&gt;
http://www.mdk.org.pl/articles/2007/04/23/chapter-1-in-which-we-meet-graff&lt;br /&gt;
&lt;br /&gt;
Be sure to check out this demo (scrolling list with inertia scrolling)&lt;br /&gt;
http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Of course it will remind you of Apple iPhone's UI. But this one runs in software mode on Nokia N770&amp;amp;800 already. The most notable part of Graff seems to be the inertia and physics integration in general.&lt;br /&gt;
&lt;br /&gt;
====Pigment API====&lt;br /&gt;
&lt;br /&gt;
Fluendo's (the Gstreamer guys) ''[https://core.fluendo.com/pigment/trac Pigment] is a Python library designed to easily build user interfaces with embedded multimedia. Its design allows to use it on several platforms, thanks to a plugin system allowing to choose the underlying graphical API. Pigment is the rendering engine of Elisa, the Fluendo Media Center project.''&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C OpenGL&lt;br /&gt;
* Bindings: Python&lt;br /&gt;
* Backends: DirectFB OpenGL&lt;br /&gt;
* Media playback integration: using Gstreamer&lt;br /&gt;
&lt;br /&gt;
====Choosing====&lt;br /&gt;
&lt;br /&gt;
Benchmarking will be needed. We have therefore to define a std testing application that would allow to compare alternatives. &lt;br /&gt;
&lt;br /&gt;
Some Clutter VS Pigment information: http://www.taimila.com/?q=node/14&lt;br /&gt;
&lt;br /&gt;
==Improvement ideas==&lt;br /&gt;
&lt;br /&gt;
Please add here any idea that seems of relevance.&lt;br /&gt;
&lt;br /&gt;
===1D list scrolling: looped physics-driven item list===&lt;br /&gt;
&lt;br /&gt;
====EDIT: demo now on the neo====&lt;br /&gt;
&lt;br /&gt;
Apparently the topics discussed here have found an echo in moko devs :)&lt;br /&gt;
&lt;br /&gt;
http://dominion.kabel.utwente.nl/koen/cms/kinetic-scrolling-on-the-neo1973&lt;br /&gt;
&lt;br /&gt;
enjoy the video demo; everything seems to be rendered software fine. More details about the implementation to come.&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
&lt;br /&gt;
[EDIT] Graff's inertia scrolling list example: http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
====Controls====&lt;br /&gt;
&lt;br /&gt;
* Sliding up/down = Single click + maintained for a minimal distance&lt;br /&gt;
&lt;br /&gt;
Effect: scroll in an inverted/negated fashion (slide down = scroll up, slide up = scroll down)&lt;br /&gt;
&lt;br /&gt;
When finger is released (i.e. touchscreen doesn't detect any press):&lt;br /&gt;
  if (last_speed_seen &amp;gt; 0 ) then keep this speed and acceleration, with friction&lt;br /&gt;
  else stop scrolling&lt;br /&gt;
&lt;br /&gt;
Scrolling here is seen as unidimensional, but can apply to bidimensional situations (ex: zoomed image) too&lt;br /&gt;
&lt;br /&gt;
* Action = quick double tap&lt;br /&gt;
&lt;br /&gt;
* Details/select = short single tap&lt;br /&gt;
&lt;br /&gt;
* Right click = long tap&lt;br /&gt;
&lt;br /&gt;
* Sliding left/right: switch sorting method&lt;br /&gt;
&lt;br /&gt;
====Parts to modify====&lt;br /&gt;
&lt;br /&gt;
''Having a scroll that isn't a 1:1 map to the user's action isn't hard. It's just an extra calculation in the scroll code.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;---- Where is the scroll code? :)&lt;br /&gt;
&lt;br /&gt;
* libmokoui&lt;br /&gt;
** [[Stylus_Scrolling | Stylus scrolling widget]]&lt;br /&gt;
** [[Finger_Scrolling | Finger scrolling wheel widget]]&lt;br /&gt;
* gtk&lt;br /&gt;
** [http://www.gtk.org/api/2.6/gtk/GtkVScrollbar.html GtkVScrollbar]&lt;br /&gt;
&lt;br /&gt;
The best would be to add the feature for both finger and stylus scrolling.&lt;br /&gt;
&lt;br /&gt;
TODO:&lt;br /&gt;
* make the entire list a &amp;quot;scrolling zone&amp;quot;, i.e. an overlay transparent scrolling widget?&lt;br /&gt;
* define controls&lt;br /&gt;
* add the inertia feature&lt;br /&gt;
&lt;br /&gt;
===1D Scrolling: inertia friction integration into openmoko's finger wheel=== &lt;br /&gt;
&lt;br /&gt;
The same, but for the wheel. It can be very short to do: you don't have 1:1 anymore, but, for example, 1/4 wheel turn = 1 item. It's demultiplicated, but has inertia.&lt;br /&gt;
&lt;br /&gt;
===Left-handed UI Support===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
A discussion on the community list identified a desire to have the ability to switch the OpenMoko UI into &amp;quot;left-handed&amp;quot; mode.  &lt;br /&gt;
&lt;br /&gt;
 The main problem is scrollbars, when they're on the right, dragging  &lt;br /&gt;
 the scrollbar left handed results in your hand covering the screen so  &lt;br /&gt;
 you can't see what you are doing. So having the option of scrollbars  &lt;br /&gt;
 on the left would be useful.&lt;br /&gt;
&lt;br /&gt;
 I don't think the whole screen should be mirrored! There are some elements&lt;br /&gt;
 that should remain..like the main top bar with the status icons and such.&lt;br /&gt;
 Scrollbars are the main thing I can think of right now.&lt;br /&gt;
&lt;br /&gt;
===Handgesture recognition proposals===&lt;br /&gt;
&lt;br /&gt;
====Using simple, localized warp as modifier key====&lt;br /&gt;
&lt;br /&gt;
As discussed on community list:&lt;br /&gt;
&lt;br /&gt;
  If you hold down one finger and tap the other one, the mouse pops over and back&lt;br /&gt;
  again. If you keep your second finger touching, the cursor follows it. When you&lt;br /&gt;
  release it, cursor goes back to first finger position. This could be a way to&lt;br /&gt;
  set a bounding box or turn on the mode. So the second finger can do something&lt;br /&gt;
  like rotating around the first, or increase or lower the distance to the first.&lt;br /&gt;
&lt;br /&gt;
* the so-called &amp;quot;first touch&amp;quot; can be done on the mokowheel zone itself: put your left thumb on the black area; if you touch the screen with another finger, there is a '''warp'''; the warp is detectable and allows to enter &amp;quot;fake multi-touchscreen mode&amp;quot;&lt;br /&gt;
* afterwards,&lt;br /&gt;
     * slide your right-hand finger down, it scrolls up&lt;br /&gt;
     * slide your right-hand finger up, it scrolls down&lt;br /&gt;
     * slide it left, next page/item&lt;br /&gt;
     * slide it right, previous page/item&lt;br /&gt;
     * do a circle: rotation&lt;br /&gt;
     * narrow towards the black circle: zoom -&lt;br /&gt;
     * go away: zoom +&lt;br /&gt;
* if you had kept your first finger on the black quarter circle, you can continue issuing other gestures&lt;br /&gt;
&lt;br /&gt;
The advantages of using simple origin-driven cursor warping as double touch detection criteria is that:&lt;br /&gt;
* you don't have to use the wheel as button, which would slow things down and generate errors (false button presses)&lt;br /&gt;
* simpler detection algorithms that can pass by the fluctuation due to pressure relative distribution&lt;br /&gt;
* the space taken by the wheel itself is &amp;quot;useless&amp;quot; (i.e. displays no information); using it as modifier allows to keep the screen clean for reading&lt;br /&gt;
* the origin of this zone lets use maximum surface of the screen, allowing more fine controlling&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_rotate_right.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_previous.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_down.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_zoom-.png]]&lt;br /&gt;
&lt;br /&gt;
*Pros:&lt;br /&gt;
** who said we need multi-touch hardware?&lt;br /&gt;
** this may be the easiest way (in terms of design/implementation complexity, reliability)&lt;br /&gt;
*Cons: &lt;br /&gt;
** no matter what we'll invent, we'll need two hands for on-the-move controlling&lt;br /&gt;
** what about left-handed people?&lt;br /&gt;
&lt;br /&gt;
====What is to modify ?====&lt;br /&gt;
&lt;br /&gt;
We need to emulate key presses. We need to work at a layer where we can get raw cursor coordinates. &amp;lt;---- X server layer?&lt;br /&gt;
&lt;br /&gt;
There is a fake keyboard module (for dev purposes) in the main kernel tree, which could be used to simulate keyboard presses (hence keeping keyboard-enabled apps unmodified).&lt;br /&gt;
&lt;br /&gt;
====Full multi-touch emulation====&lt;br /&gt;
&lt;br /&gt;
Doable, but tricky...&lt;br /&gt;
&lt;br /&gt;
==Preparing the multi touch==&lt;br /&gt;
&lt;br /&gt;
One day we might get multitouch devices. Let's get ready.&lt;br /&gt;
&lt;br /&gt;
===MPX===&lt;br /&gt;
 	&lt;br /&gt;
The Multi-Pointer X Server is a modification of the X server to support multiple mice and keyboards in X. It provides users with one cursor per device and one keyboard focus per keyboard. Each cursor can operate independently. MPX is the first multicursor windowing system and allows two-handed interaction with legacy applications, but also the creation of innovative applications and user interfaces. &lt;br /&gt;
&lt;br /&gt;
[http://wearables.unisa.edu.au/mpx/ The multipoint X server project]&lt;br /&gt;
&lt;br /&gt;
===MacSlow's Lowfat getting multitouched===&lt;br /&gt;
&lt;br /&gt;
http://dlai.jafu.dk/?p=1&lt;br /&gt;
&lt;br /&gt;
==Open questions==&lt;br /&gt;
&lt;br /&gt;
* will the neo/openmoko graphics system be powerful enough for such uses? I apple uses an OpenGL ES acceleration on this device (as well as on recent iPods), which is on the way with [[GTA02#.22Phase_2.22_.28GTA02.2C_.22Mass_Market.22.29|GTA02]].&lt;br /&gt;
* how does the touchscreen behave? We need a detailed touchscreen wiki information page, with visual traces. How hardware-specific is it?&lt;br /&gt;
* is multi touch really that awesome? I guess not.&lt;br /&gt;
&lt;br /&gt;
{{Languages|UI Improvements}}&lt;br /&gt;
&lt;br /&gt;
[[Category:User Interfaces| ]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/UI_Improvements</id>
		<title>UI Improvements</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/UI_Improvements"/>
				<updated>2007-07-27T17:20:59Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Choosing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
  Obviously the tools are in the wild to build interfaces that could rival&lt;br /&gt;
  (or better IMO) anything Apple comes up with. We just need to organize&lt;br /&gt;
  this stuff. This would need hardware that can support dynamic&lt;br /&gt;
  interfaces. I can help here, too.&lt;br /&gt;
  sean@openmoko.com&lt;br /&gt;
&lt;br /&gt;
In fact, this place shall be dedicated to human-machine interactions improvements discussion;&lt;br /&gt;
&lt;br /&gt;
Human-machine interaction can be separated into several aspects:&lt;br /&gt;
* the physical contact/input device: the mono-touch touchscreen&lt;br /&gt;
* the graphics: &lt;br /&gt;
** accelerated rendering can add more consistency to zooming user interfaces, which seem to be quite an interesting concept for embedded scrensize-limited devices&lt;br /&gt;
** adding physics &amp;quot;look and feel&amp;quot; to (ex: menu's) behaviours can add coherence too&lt;br /&gt;
* the input methods&lt;br /&gt;
** the virtual keyboard&lt;br /&gt;
** handgestures&lt;br /&gt;
&lt;br /&gt;
==Finding inspiration ...==&lt;br /&gt;
&lt;br /&gt;
===Seen Live===&lt;br /&gt;
&lt;br /&gt;
'''Multi-touch'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=89sz8ExZndc Multi-Touchscreen experiments video @youtube]&lt;br /&gt;
*[http://www.youtube.com/watch?v=nPqqfVLQ_qY iPhone UI features demo @youtube]&lt;br /&gt;
* Multi-touch on Linux with [http://www.youtube.com/watch?v=olWjnfBoY8E MPX]&lt;br /&gt;
&lt;br /&gt;
'''Zooming user interfaces'''&lt;br /&gt;
*[http://www.zenzui.com/products.html ZenZui], a [http://en.wikipedia.org/wiki/ZUI ZUI (zooming user interface)]&lt;br /&gt;
*[http://labs.live.com/Deepfish/videos.aspx Microsoft Bluefish's ZUI] (new mobile webbrowser)&lt;br /&gt;
*[http://googlesystem.blogspot.com/2007/04/opera-920-more-homepages-at-your.html Opera speed dial]&lt;br /&gt;
&lt;br /&gt;
'''Graphics'''&lt;br /&gt;
*[http://www.rasterman.com/files/eem.avi EEM], Rasterman's EFL libs on handelds proof of concept (doesn't DO anything, just showing off the EFLs on a handeld)&lt;br /&gt;
*[http://www.youtube.com/watch?v=8kLFPfaxQ6U&amp;amp;eurl= Nvidia's cutting-edge techno], an [http://www.khronos.org/openkode/ Openkode] demo&lt;br /&gt;
*[http://files.mdk.am/demos/graff-demo-3.avi Graff]'s inertia scroll list&lt;br /&gt;
&lt;br /&gt;
'''Science fiction'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=G_FS2TiK3AI UPMC Future?]&lt;br /&gt;
&lt;br /&gt;
'''Links:'''&lt;br /&gt;
*[http://elevate.sourceforge.net/links.html elevate project's links] sums up quite greatly the latest innovations in the desktop area&lt;br /&gt;
*[http://nooface.net/ Nooface] is a human-machine news site&lt;br /&gt;
*Asus-Intel's [http://www.hothardware.com/articles/Hands_on_with_the_ASUS_Eee/?page=2 Eee]'s interface&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===n-D navigation: the polyhedra inspiration===&lt;br /&gt;
&lt;br /&gt;
When we want to navigate files, mp3s in an mp3 player, etc... Every control that the application needs is a button. What about looking at the polyhedrons? We could find one for each usage, with as many surrounding subzones that may be used as controls. Ex: you need 5 buttons, let's take a pentagon with 5 surrounding zones all around. That way, it's always optimized...&lt;br /&gt;
&lt;br /&gt;
http://en.wikipedia.org/wiki/Polyhedra&lt;br /&gt;
http://en.wikipedia.org/wiki/List_of_uniform_polyhedra&lt;br /&gt;
&lt;br /&gt;
===Our weapons===&lt;br /&gt;
&lt;br /&gt;
We can't improve the human-machine interface without knowing the strengths / weaknesses of our hardware; some of the weaknesses might turn out as exploitable features, some strengths as limiting constraints.&lt;br /&gt;
&lt;br /&gt;
====The touchscreen====&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What exactly does the touchscreen see when  you touch the screen with 2 fingers&lt;br /&gt;
  at the same time, when you move them, when you move only one of the 2, etc. I'm &lt;br /&gt;
  also interested in knowing how precise the touchscreen is (ex: refresh rate, &lt;br /&gt;
  possible pressure indication, ...)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* The output is the center of the bounding box of the touched area&lt;br /&gt;
* The touch point skips instantly on double touch&lt;br /&gt;
* Pressure has almost no effect on a single touch, but not so on a double touch. The relative pressures will cause a significant skewing effect towards the harder touch. You can easily move the pointer along the line between your two fingers by changing the relative pressure.&lt;br /&gt;
&lt;br /&gt;
Conclusions:&lt;br /&gt;
* we can detect double touch as jumps, and that's all&lt;br /&gt;
* no pressure&lt;br /&gt;
* This could be an interesting input method for games - e.g. holding the Neo in landscape view, letting each thumb rest on a specific input area; probably needs to be checked for usability with a real device&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when sliding two fingers in parallel up(L,R)-&amp;gt;down(L,R)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see a slide along the center line between your two fingers. In practice, you can't keep the pressure equal, so you will see some kind of zig-zag line somewhere between the two pressure points in the direction of your slide.&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when narrowing two fingers in slide (=zoom effect on iphone)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see the pointer stay at the center of the zoom movement. In practice, you can't keep the pressure equal for both fingers, so the pointer will move towards one of the two pressure points.&lt;br /&gt;
&lt;br /&gt;
====Graphics and computational capabilities====&lt;br /&gt;
&lt;br /&gt;
It would be good to report what performance the current hardware allows:&lt;br /&gt;
* There was no pure X11 benchmarking done (AFAIK) (how many fps at full VGA scrolling, ex: 1024*480 image scrolling?)&lt;br /&gt;
* what about the lcd reactivity? What if we don't see anything but blur while moving items fast?&lt;br /&gt;
&lt;br /&gt;
Please report here your impressions.&lt;br /&gt;
&lt;br /&gt;
==Areas of improvement==&lt;br /&gt;
&lt;br /&gt;
* OpenGL for fluid zooming interfaces (2D: the infinite sphere model, 1D: the infinite wheel of fortune/ribbon model, exposé)&lt;br /&gt;
* HandGestures&lt;br /&gt;
* Physics-model based improvements: inertia and friction&lt;br /&gt;
* multi touch screen for natural handgestures &lt;br /&gt;
* improved virtual keyboard&lt;br /&gt;
* switching to another GUI toolkit (EFLs)&lt;br /&gt;
&lt;br /&gt;
===Physics-inspired animation a.k.a. &amp;quot;Digital Physics&amp;quot;===&lt;br /&gt;
&lt;br /&gt;
If we want to add eye candy &amp;amp; usability to the UI (such as smooth realistic list scrolling, as seen in apple's&lt;br /&gt;
iphone demo on contacts lists for instance), we'll need a physics engine, so that moves &amp;amp; animations aren't all linear.&lt;br /&gt;
&lt;br /&gt;
The following aticle explains the [http://www.readwriteweb.com/archives/the_physics_of_iphone.php Digital Physics] term from the iPhone example.&lt;br /&gt;
&lt;br /&gt;
The most used technique for calculating trajectories and systems of related geometrical objects seems to be [http://en.wikipedia.org/wiki/Verlet_integration verlet integration] implementation; it is an alternative to Euler's integration method, using fast approximation. &lt;br /&gt;
&lt;br /&gt;
We may have no need for such a mathematical method at first, but perhaps there are other use cases. For instance, it may be useful to gesture recognition (i'm not aware if existing gesture recognition engines measure speed, acceleration...).&lt;br /&gt;
&lt;br /&gt;
====Open Dynamics Engine====&lt;br /&gt;
&lt;br /&gt;
ODE is an open source, high performance library for simulating rigid body dynamics. It is fully featured, stable, mature and platform independent with an easy to use C/C++ API. It has advanced joint types and integrated collision detection with friction. ODE is useful for simulating vehicles, objects in virtual reality environments and virtual creatures. It is currently used in many computer games, 3D authoring tools and simulation tools.&lt;br /&gt;
&lt;br /&gt;
http://www.ode.org/&lt;br /&gt;
&lt;br /&gt;
====Libakamaru====&lt;br /&gt;
&lt;br /&gt;
The [http://people.freedesktop.org/~krh/akamaru.git/ akamaru library] is the code behind [http://www.youtube.com/watch?v=VekgyKQoTeM kiba dock]'s fun and dynamic behaviour. It's dependencies are light (needs just GLib). It takes elasticity, friction, gravity into account.&lt;br /&gt;
&lt;br /&gt;
If you want to take a quick look at the code:&lt;br /&gt;
svn co http://svn.kiba-dock.org/akamaru/ akamaru&lt;br /&gt;
&lt;br /&gt;
The only (AFAIK) application using this library is kiba-dock, a *fun* app launcher, but we may find another use to it in the future.&lt;br /&gt;
&lt;br /&gt;
As suggested on the mailing list, it is mostly overkill for the uses we intend to have, but this library may be optimized already, the API can spare some time for too. Furthermore, ''Qui peut le plus, peut le moins''.&lt;br /&gt;
&lt;br /&gt;
====Verlet integration implementation from e17====&lt;br /&gt;
&lt;br /&gt;
There's an undergoing verlet integration implementation into the e17 project (by rephorm) see http://rephorm.com/news/tag/physics , so we may see some UI physics integration into e17 someday.&lt;br /&gt;
&lt;br /&gt;
====Robert Pernner's easy equations====&lt;br /&gt;
&lt;br /&gt;
http://www.robertpenner.com/easing/&lt;br /&gt;
&lt;br /&gt;
See the demo: implements non linear behaviour (actionscript), but may give inspiration&lt;br /&gt;
&lt;br /&gt;
===Extending the touchscreen capabilities and input methods===&lt;br /&gt;
&lt;br /&gt;
* '''Multitouchscreen emulation'''&lt;br /&gt;
&lt;br /&gt;
If we got it right, when touching the screen on a second place, the cursor oscillates between the two points depending on relative pressure distribution. Using averaging algorithms, we may have the opportunity to detect peculiar behaviours.&lt;br /&gt;
&lt;br /&gt;
We need raw data (x,y,t) from the real hardware for the following behaviours:&lt;br /&gt;
* slide two fingers in parallel - vertical up/down (scroll)&lt;br /&gt;
* turn the two fingers around (rotate)&lt;br /&gt;
* slide two fingers towards each other (zoom-)&lt;br /&gt;
* slide two fingers apart (zoom+)&lt;br /&gt;
&lt;br /&gt;
When touching the screen with two fingers at the same time, we necessarily see the two points, or are able to extrapolate the position of the second one. This solution can add feature, but will probably be little erratic...&lt;br /&gt;
&lt;br /&gt;
* '''Touchscreen kernel module hacking'''&lt;br /&gt;
&lt;br /&gt;
We may correct the &amp;quot;half distance&amp;quot; phenomenon on double touch: if double touch is detected, then assimilate the cursor as twice further than the first touch. It would allow finer control, but higher instability.&lt;br /&gt;
&lt;br /&gt;
The double touch detection may be implemented in the driver itself, as well as stabilization.&lt;br /&gt;
&lt;br /&gt;
* '''Other detectable behaviours'''&lt;br /&gt;
&lt;br /&gt;
The warping can be used in the 4 diagonals, plus the up/down/right/left cross:&lt;br /&gt;
&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
  - 1            -  - 1          2 -  - 1            -  -      2       -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -             2-  -              -  - 2            -  -      1       -&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
&lt;br /&gt;
It's not double touch, but two sequential presses with a short time in between (~0.5 s)&lt;br /&gt;
&lt;br /&gt;
* '''Clever hacks'''&lt;br /&gt;
&lt;br /&gt;
It's been said that having no multitouch screen allows less freedom for innovation. Maybe we could get something out of our touchscreen drivers.&lt;br /&gt;
&lt;br /&gt;
Why ? Think of apple's scroll up/down feature on macbooks touchpads (which '''aren't multi touch''', it's a [http://iscroll2.sourceforge.net/ clever driver hack, iscroll2]):&lt;br /&gt;
&lt;br /&gt;
  To scroll, just place two fingers on your trackpad instead of one. Both fingers&lt;br /&gt;
  need to be placed next to each other horizontally (not vertically, the trackpad &lt;br /&gt;
  cannot detect that). Some people get better results with their finger spaced a&lt;br /&gt;
  little bit apart, while others prefer having the fingers right next to each other.&lt;br /&gt;
&lt;br /&gt;
  iScroll2 provides two scrolling modes: Linear and circular scrolling.&lt;br /&gt;
&lt;br /&gt;
  For linear scrolling, move the two fingers up/down or left/right in a straight &lt;br /&gt;
  line, respectively, to scroll in that direction.&lt;br /&gt;
&lt;br /&gt;
  Circular scrolling works in a way similar to the iPod's scroll wheel: Move the two&lt;br /&gt;
  fingers in a circle to scroll up or down, depending   on whether you move in a &lt;br /&gt;
  clockwise or counterclockwise direction.&lt;br /&gt;
&lt;br /&gt;
Maybe we can port/adapt/get inspiration from this macintosh driver.&lt;br /&gt;
&lt;br /&gt;
===Improved virtual keyboard===&lt;br /&gt;
&lt;br /&gt;
One nice idea for virtual input is [http://www.micropp.se/openmoko/ finger-splash]&lt;br /&gt;
&lt;br /&gt;
Yet, optimization does not only apply to the plain one-letter-at-a-time input. We need some sort of T9 (dictionary-based input help). When typing a word, the first letter determines the next possible ones. Therefore, we may let disappear the less-probable following letters. Ex: type an L, there's no way an X follows...&lt;br /&gt;
&lt;br /&gt;
Hints: &lt;br /&gt;
* ZIP's huffmann compression applied to SMSs/mails for detecting the most used characters/words/sentences.&lt;br /&gt;
* html tag-clouds, one-letter tag clouds ; font size proportional to the probability of being used&lt;br /&gt;
&lt;br /&gt;
The most critical point is the initial disposition of the letters, before any letter is typed. We may also want to use horizontal two-parts keyboard (with the neo in hands like a psp..)&lt;br /&gt;
&lt;br /&gt;
The [http://www.strout.net/info/ideas/hexinput.html hexinput] concept is interesting. What about hiding the less probable letters and increasing the remaining ones during typing?&lt;br /&gt;
&lt;br /&gt;
===Towards OpenGL compositing===&lt;br /&gt;
&lt;br /&gt;
There are [http://www.hbmobile.org/wiki/index.php?title=GUI_Frameworks lots of possible GUI frameworks] with various software architectures that could be used for OpenMoko.&lt;br /&gt;
&lt;br /&gt;
GTA01 hardware uses GTK+/matchbox without hardware acceleration, and it's not enough: this is a first that a mobile Linux device has such a high DPI resolution. OpenGL ES compositing seems to have a bright future on embedded devices, because compositing seems to give natural zooming interfaces reality (at last!).&lt;br /&gt;
&lt;br /&gt;
Considering recent changes in destkop applications, opengl has a definite future. For instance, the expose (be it apple's or beryl's) is a very interesting and usable feature. Using compositing allows the physics metaphore: '''the human brain doesn't like &amp;quot;gaps&amp;quot;/jumps (for instance while scrolling a text), it needs continuity''', which can be provided by opengl. When you look at apple's iphone prototype, it's not just eye candy, it's maybe the most natural/human way of navigating, because it's sufficiently realistic for the brain to forget the non-physical nature of what's inside.&lt;br /&gt;
&lt;br /&gt;
So, opengl hardware will be needed in a more or less distant hardware, for 100% fluid operation. Benchmarking will be needed to compare the different alternatives that are cited further.&lt;br /&gt;
&lt;br /&gt;
====The Enlightenment Foundation Libraries====&lt;br /&gt;
&lt;br /&gt;
EFL's Evas is a powerful and power sparing canvas drawing library. It can be OpenGL accelerated. Python/Ruby bindings are available in the &amp;quot;proto&amp;quot; e17 cvs folder.&lt;br /&gt;
&lt;br /&gt;
''Moved [[E17|here]]''&lt;br /&gt;
&lt;br /&gt;
====Clutter Toolkit====&lt;br /&gt;
&lt;br /&gt;
Clutter, an [http://o-hand.com/ OpenedHand] project, is an open source software library for creating fast, visually rich graphical user interfaces. The most obvious example of potential usage is in media center type applications.&lt;br /&gt;
&lt;br /&gt;
http://clutter-project.org/&lt;br /&gt;
&lt;br /&gt;
Clutter uses OpenGL (and optionally '''OpenGL ES''') for rendering but with an API which hides the underlying GL complexity from the developer. The Clutter API is intended to be easy to use, efficient and flexible.&lt;br /&gt;
&lt;br /&gt;
It does integrate gstreamer (for easy media playback, even camera or mic inputs), allows pango text rendering, cairo graphics rendering. Provided bindings are python, C# and Ruby.&lt;br /&gt;
&lt;br /&gt;
GTK off screen rendering is supposed to be on it's way; once it is here, there will be a possibility of using GTK apps directly within OpenGL apps as textures, which would lead to the possibility of creating a full OpenGL &amp;quot;application manager&amp;quot; (as well as media consuming app) with ZUI features.&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C, OpenGL&lt;br /&gt;
* Bindings: Python, C#, Ruby&lt;br /&gt;
* Backends: GLX / SDL / EGL&lt;br /&gt;
* Media support: Gstreamer integration, Cairo graphics rendering, Pango fonts rendering&lt;br /&gt;
* Embedding: GTK embedding&lt;br /&gt;
&lt;br /&gt;
====Graff====&lt;br /&gt;
&lt;br /&gt;
An early demonstration of Graff, which ''is a lighweight high-performance graphics rendering library.''&lt;br /&gt;
http://www.mdk.org.pl/articles/2007/04/23/chapter-1-in-which-we-meet-graff&lt;br /&gt;
&lt;br /&gt;
Be sure to check out this demo (scrolling list with inertia scrolling)&lt;br /&gt;
http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Of course it will remind you of Apple iPhone's UI. But this one runs in software mode on Nokia N770&amp;amp;800 already. The most notable part of Graff seems to be the inertia and physics integration in general.&lt;br /&gt;
&lt;br /&gt;
====Pigment API====&lt;br /&gt;
&lt;br /&gt;
Fluendo's (the Gstreamer guys) ''[https://core.fluendo.com/pigment/trac Pigment] is a Python library designed to easily build user interfaces with embedded multimedia. Its design allows to use it on several platforms, thanks to a plugin system allowing to choose the underlying graphical API. Pigment is the rendering engine of Elisa, the Fluendo Media Center project.''&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C OpenGL&lt;br /&gt;
* Bindings: Python&lt;br /&gt;
* Backends: DirectFB OpenGL&lt;br /&gt;
* Media playback integration: using Gstreamer&lt;br /&gt;
&lt;br /&gt;
====Choosing====&lt;br /&gt;
&lt;br /&gt;
Benchmarking will be needed. We have therefore to define a std testing application that would allow to compare alternatives. &lt;br /&gt;
&lt;br /&gt;
Some Clutter VS Pigment information: http://www.taimila.com/?q=node/14&lt;br /&gt;
&lt;br /&gt;
==Improvement ideas==&lt;br /&gt;
&lt;br /&gt;
Please add here any idea that seems of relevance.&lt;br /&gt;
&lt;br /&gt;
===1D list scrolling: looped physics-driven item list===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
&lt;br /&gt;
[EDIT] Graff's inertia scrolling list example: http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
====Controls====&lt;br /&gt;
&lt;br /&gt;
* Sliding up/down = Single click + maintained for a minimal distance&lt;br /&gt;
&lt;br /&gt;
Effect: scroll in an inverted/negated fashion (slide down = scroll up, slide up = scroll down)&lt;br /&gt;
&lt;br /&gt;
When finger is released (i.e. touchscreen doesn't detect any press):&lt;br /&gt;
  if (last_speed_seen &amp;gt; 0 ) then keep this speed and acceleration, with friction&lt;br /&gt;
  else stop scrolling&lt;br /&gt;
&lt;br /&gt;
Scrolling here is seen as unidimensional, but can apply to bidimensional situations (ex: zoomed image) too&lt;br /&gt;
&lt;br /&gt;
* Action = quick double tap&lt;br /&gt;
&lt;br /&gt;
* Details/select = short single tap&lt;br /&gt;
&lt;br /&gt;
* Right click = long tap&lt;br /&gt;
&lt;br /&gt;
* Sliding left/right: switch sorting method&lt;br /&gt;
&lt;br /&gt;
====Parts to modify====&lt;br /&gt;
&lt;br /&gt;
''Having a scroll that isn't a 1:1 map to the user's action isn't hard. It's just an extra calculation in the scroll code.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;---- Where is the scroll code? :)&lt;br /&gt;
&lt;br /&gt;
* libmokoui&lt;br /&gt;
** [[Stylus_Scrolling | Stylus scrolling widget]]&lt;br /&gt;
** [[Finger_Scrolling | Finger scrolling wheel widget]]&lt;br /&gt;
* gtk&lt;br /&gt;
** [http://www.gtk.org/api/2.6/gtk/GtkVScrollbar.html GtkVScrollbar]&lt;br /&gt;
&lt;br /&gt;
The best would be to add the feature for both finger and stylus scrolling.&lt;br /&gt;
&lt;br /&gt;
TODO:&lt;br /&gt;
* make the entire list a &amp;quot;scrolling zone&amp;quot;, i.e. an overlay transparent scrolling widget?&lt;br /&gt;
* define controls&lt;br /&gt;
* add the inertia feature&lt;br /&gt;
&lt;br /&gt;
===1D Scrolling: inertia friction integration into openmoko's finger wheel=== &lt;br /&gt;
&lt;br /&gt;
The same, but for the wheel. It can be very short to do: you don't have 1:1 anymore, but, for example, 1/4 wheel turn = 1 item. It's demultiplicated, but has inertia.&lt;br /&gt;
&lt;br /&gt;
===Left-handed UI Support===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
A discussion on the community list identified a desire to have the ability to switch the OpenMoko UI into &amp;quot;left-handed&amp;quot; mode.  &lt;br /&gt;
&lt;br /&gt;
 The main problem is scrollbars, when they're on the right, dragging  &lt;br /&gt;
 the scrollbar left handed results in your hand covering the screen so  &lt;br /&gt;
 you can't see what you are doing. So having the option of scrollbars  &lt;br /&gt;
 on the left would be useful.&lt;br /&gt;
&lt;br /&gt;
 I don't think the whole screen should be mirrored! There are some elements&lt;br /&gt;
 that should remain..like the main top bar with the status icons and such.&lt;br /&gt;
 Scrollbars are the main thing I can think of right now.&lt;br /&gt;
&lt;br /&gt;
===Handgesture recognition proposals===&lt;br /&gt;
&lt;br /&gt;
====Using simple, localized warp as modifier key====&lt;br /&gt;
&lt;br /&gt;
As discussed on community list:&lt;br /&gt;
&lt;br /&gt;
  If you hold down one finger and tap the other one, the mouse pops over and back&lt;br /&gt;
  again. If you keep your second finger touching, the cursor follows it. When you&lt;br /&gt;
  release it, cursor goes back to first finger position. This could be a way to&lt;br /&gt;
  set a bounding box or turn on the mode. So the second finger can do something&lt;br /&gt;
  like rotating around the first, or increase or lower the distance to the first.&lt;br /&gt;
&lt;br /&gt;
* the so-called &amp;quot;first touch&amp;quot; can be done on the mokowheel zone itself: put your left thumb on the black area; if you touch the screen with another finger, there is a '''warp'''; the warp is detectable and allows to enter &amp;quot;fake multi-touchscreen mode&amp;quot;&lt;br /&gt;
* afterwards,&lt;br /&gt;
     * slide your right-hand finger down, it scrolls up&lt;br /&gt;
     * slide your right-hand finger up, it scrolls down&lt;br /&gt;
     * slide it left, next page/item&lt;br /&gt;
     * slide it right, previous page/item&lt;br /&gt;
     * do a circle: rotation&lt;br /&gt;
     * narrow towards the black circle: zoom -&lt;br /&gt;
     * go away: zoom +&lt;br /&gt;
* if you had kept your first finger on the black quarter circle, you can continue issuing other gestures&lt;br /&gt;
&lt;br /&gt;
The advantages of using simple origin-driven cursor warping as double touch detection criteria is that:&lt;br /&gt;
* you don't have to use the wheel as button, which would slow things down and generate errors (false button presses)&lt;br /&gt;
* simpler detection algorithms that can pass by the fluctuation due to pressure relative distribution&lt;br /&gt;
* the space taken by the wheel itself is &amp;quot;useless&amp;quot; (i.e. displays no information); using it as modifier allows to keep the screen clean for reading&lt;br /&gt;
* the origin of this zone lets use maximum surface of the screen, allowing more fine controlling&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_rotate_right.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_previous.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_down.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_zoom-.png]]&lt;br /&gt;
&lt;br /&gt;
*Pros:&lt;br /&gt;
** who said we need multi-touch hardware?&lt;br /&gt;
** this may be the easiest way (in terms of design/implementation complexity, reliability)&lt;br /&gt;
*Cons: &lt;br /&gt;
** no matter what we'll invent, we'll need two hands for on-the-move controlling&lt;br /&gt;
** what about left-handed people?&lt;br /&gt;
&lt;br /&gt;
====What is to modify ?====&lt;br /&gt;
&lt;br /&gt;
We need to emulate key presses. We need to work at a layer where we can get raw cursor coordinates. &amp;lt;---- X server layer?&lt;br /&gt;
&lt;br /&gt;
There is a fake keyboard module (for dev purposes) in the main kernel tree, which could be used to simulate keyboard presses (hence keeping keyboard-enabled apps unmodified).&lt;br /&gt;
&lt;br /&gt;
====Full multi-touch emulation====&lt;br /&gt;
&lt;br /&gt;
Doable, but tricky...&lt;br /&gt;
&lt;br /&gt;
==Preparing the multi touch==&lt;br /&gt;
&lt;br /&gt;
One day we might get multitouch devices. Let's get ready.&lt;br /&gt;
&lt;br /&gt;
===MPX===&lt;br /&gt;
 	&lt;br /&gt;
The Multi-Pointer X Server is a modification of the X server to support multiple mice and keyboards in X. It provides users with one cursor per device and one keyboard focus per keyboard. Each cursor can operate independently. MPX is the first multicursor windowing system and allows two-handed interaction with legacy applications, but also the creation of innovative applications and user interfaces. &lt;br /&gt;
&lt;br /&gt;
[http://wearables.unisa.edu.au/mpx/ The multipoint X server project]&lt;br /&gt;
&lt;br /&gt;
===MacSlow's Lowfat getting multitouched===&lt;br /&gt;
&lt;br /&gt;
http://dlai.jafu.dk/?p=1&lt;br /&gt;
&lt;br /&gt;
==Open questions==&lt;br /&gt;
&lt;br /&gt;
* will the neo/openmoko graphics system be powerful enough for such uses? I apple uses an OpenGL ES acceleration on this device (as well as on recent iPods), which is on the way with [[GTA02#.22Phase_2.22_.28GTA02.2C_.22Mass_Market.22.29|GTA02]].&lt;br /&gt;
* how does the touchscreen behave? We need a detailed touchscreen wiki information page, with visual traces. How hardware-specific is it?&lt;br /&gt;
* is multi touch really that awesome? I guess not.&lt;br /&gt;
&lt;br /&gt;
{{Languages|UI Improvements}}&lt;br /&gt;
&lt;br /&gt;
[[Category:User Interfaces| ]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/UI_Improvements</id>
		<title>UI Improvements</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/UI_Improvements"/>
				<updated>2007-07-27T17:20:07Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Extending the touchscreen capabilities and input methods */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
  Obviously the tools are in the wild to build interfaces that could rival&lt;br /&gt;
  (or better IMO) anything Apple comes up with. We just need to organize&lt;br /&gt;
  this stuff. This would need hardware that can support dynamic&lt;br /&gt;
  interfaces. I can help here, too.&lt;br /&gt;
  sean@openmoko.com&lt;br /&gt;
&lt;br /&gt;
In fact, this place shall be dedicated to human-machine interactions improvements discussion;&lt;br /&gt;
&lt;br /&gt;
Human-machine interaction can be separated into several aspects:&lt;br /&gt;
* the physical contact/input device: the mono-touch touchscreen&lt;br /&gt;
* the graphics: &lt;br /&gt;
** accelerated rendering can add more consistency to zooming user interfaces, which seem to be quite an interesting concept for embedded scrensize-limited devices&lt;br /&gt;
** adding physics &amp;quot;look and feel&amp;quot; to (ex: menu's) behaviours can add coherence too&lt;br /&gt;
* the input methods&lt;br /&gt;
** the virtual keyboard&lt;br /&gt;
** handgestures&lt;br /&gt;
&lt;br /&gt;
==Finding inspiration ...==&lt;br /&gt;
&lt;br /&gt;
===Seen Live===&lt;br /&gt;
&lt;br /&gt;
'''Multi-touch'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=89sz8ExZndc Multi-Touchscreen experiments video @youtube]&lt;br /&gt;
*[http://www.youtube.com/watch?v=nPqqfVLQ_qY iPhone UI features demo @youtube]&lt;br /&gt;
* Multi-touch on Linux with [http://www.youtube.com/watch?v=olWjnfBoY8E MPX]&lt;br /&gt;
&lt;br /&gt;
'''Zooming user interfaces'''&lt;br /&gt;
*[http://www.zenzui.com/products.html ZenZui], a [http://en.wikipedia.org/wiki/ZUI ZUI (zooming user interface)]&lt;br /&gt;
*[http://labs.live.com/Deepfish/videos.aspx Microsoft Bluefish's ZUI] (new mobile webbrowser)&lt;br /&gt;
*[http://googlesystem.blogspot.com/2007/04/opera-920-more-homepages-at-your.html Opera speed dial]&lt;br /&gt;
&lt;br /&gt;
'''Graphics'''&lt;br /&gt;
*[http://www.rasterman.com/files/eem.avi EEM], Rasterman's EFL libs on handelds proof of concept (doesn't DO anything, just showing off the EFLs on a handeld)&lt;br /&gt;
*[http://www.youtube.com/watch?v=8kLFPfaxQ6U&amp;amp;eurl= Nvidia's cutting-edge techno], an [http://www.khronos.org/openkode/ Openkode] demo&lt;br /&gt;
*[http://files.mdk.am/demos/graff-demo-3.avi Graff]'s inertia scroll list&lt;br /&gt;
&lt;br /&gt;
'''Science fiction'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=G_FS2TiK3AI UPMC Future?]&lt;br /&gt;
&lt;br /&gt;
'''Links:'''&lt;br /&gt;
*[http://elevate.sourceforge.net/links.html elevate project's links] sums up quite greatly the latest innovations in the desktop area&lt;br /&gt;
*[http://nooface.net/ Nooface] is a human-machine news site&lt;br /&gt;
*Asus-Intel's [http://www.hothardware.com/articles/Hands_on_with_the_ASUS_Eee/?page=2 Eee]'s interface&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===n-D navigation: the polyhedra inspiration===&lt;br /&gt;
&lt;br /&gt;
When we want to navigate files, mp3s in an mp3 player, etc... Every control that the application needs is a button. What about looking at the polyhedrons? We could find one for each usage, with as many surrounding subzones that may be used as controls. Ex: you need 5 buttons, let's take a pentagon with 5 surrounding zones all around. That way, it's always optimized...&lt;br /&gt;
&lt;br /&gt;
http://en.wikipedia.org/wiki/Polyhedra&lt;br /&gt;
http://en.wikipedia.org/wiki/List_of_uniform_polyhedra&lt;br /&gt;
&lt;br /&gt;
===Our weapons===&lt;br /&gt;
&lt;br /&gt;
We can't improve the human-machine interface without knowing the strengths / weaknesses of our hardware; some of the weaknesses might turn out as exploitable features, some strengths as limiting constraints.&lt;br /&gt;
&lt;br /&gt;
====The touchscreen====&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What exactly does the touchscreen see when  you touch the screen with 2 fingers&lt;br /&gt;
  at the same time, when you move them, when you move only one of the 2, etc. I'm &lt;br /&gt;
  also interested in knowing how precise the touchscreen is (ex: refresh rate, &lt;br /&gt;
  possible pressure indication, ...)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* The output is the center of the bounding box of the touched area&lt;br /&gt;
* The touch point skips instantly on double touch&lt;br /&gt;
* Pressure has almost no effect on a single touch, but not so on a double touch. The relative pressures will cause a significant skewing effect towards the harder touch. You can easily move the pointer along the line between your two fingers by changing the relative pressure.&lt;br /&gt;
&lt;br /&gt;
Conclusions:&lt;br /&gt;
* we can detect double touch as jumps, and that's all&lt;br /&gt;
* no pressure&lt;br /&gt;
* This could be an interesting input method for games - e.g. holding the Neo in landscape view, letting each thumb rest on a specific input area; probably needs to be checked for usability with a real device&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when sliding two fingers in parallel up(L,R)-&amp;gt;down(L,R)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see a slide along the center line between your two fingers. In practice, you can't keep the pressure equal, so you will see some kind of zig-zag line somewhere between the two pressure points in the direction of your slide.&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when narrowing two fingers in slide (=zoom effect on iphone)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see the pointer stay at the center of the zoom movement. In practice, you can't keep the pressure equal for both fingers, so the pointer will move towards one of the two pressure points.&lt;br /&gt;
&lt;br /&gt;
====Graphics and computational capabilities====&lt;br /&gt;
&lt;br /&gt;
It would be good to report what performance the current hardware allows:&lt;br /&gt;
* There was no pure X11 benchmarking done (AFAIK) (how many fps at full VGA scrolling, ex: 1024*480 image scrolling?)&lt;br /&gt;
* what about the lcd reactivity? What if we don't see anything but blur while moving items fast?&lt;br /&gt;
&lt;br /&gt;
Please report here your impressions.&lt;br /&gt;
&lt;br /&gt;
==Areas of improvement==&lt;br /&gt;
&lt;br /&gt;
* OpenGL for fluid zooming interfaces (2D: the infinite sphere model, 1D: the infinite wheel of fortune/ribbon model, exposé)&lt;br /&gt;
* HandGestures&lt;br /&gt;
* Physics-model based improvements: inertia and friction&lt;br /&gt;
* multi touch screen for natural handgestures &lt;br /&gt;
* improved virtual keyboard&lt;br /&gt;
* switching to another GUI toolkit (EFLs)&lt;br /&gt;
&lt;br /&gt;
===Physics-inspired animation a.k.a. &amp;quot;Digital Physics&amp;quot;===&lt;br /&gt;
&lt;br /&gt;
If we want to add eye candy &amp;amp; usability to the UI (such as smooth realistic list scrolling, as seen in apple's&lt;br /&gt;
iphone demo on contacts lists for instance), we'll need a physics engine, so that moves &amp;amp; animations aren't all linear.&lt;br /&gt;
&lt;br /&gt;
The following aticle explains the [http://www.readwriteweb.com/archives/the_physics_of_iphone.php Digital Physics] term from the iPhone example.&lt;br /&gt;
&lt;br /&gt;
The most used technique for calculating trajectories and systems of related geometrical objects seems to be [http://en.wikipedia.org/wiki/Verlet_integration verlet integration] implementation; it is an alternative to Euler's integration method, using fast approximation. &lt;br /&gt;
&lt;br /&gt;
We may have no need for such a mathematical method at first, but perhaps there are other use cases. For instance, it may be useful to gesture recognition (i'm not aware if existing gesture recognition engines measure speed, acceleration...).&lt;br /&gt;
&lt;br /&gt;
====Open Dynamics Engine====&lt;br /&gt;
&lt;br /&gt;
ODE is an open source, high performance library for simulating rigid body dynamics. It is fully featured, stable, mature and platform independent with an easy to use C/C++ API. It has advanced joint types and integrated collision detection with friction. ODE is useful for simulating vehicles, objects in virtual reality environments and virtual creatures. It is currently used in many computer games, 3D authoring tools and simulation tools.&lt;br /&gt;
&lt;br /&gt;
http://www.ode.org/&lt;br /&gt;
&lt;br /&gt;
====Libakamaru====&lt;br /&gt;
&lt;br /&gt;
The [http://people.freedesktop.org/~krh/akamaru.git/ akamaru library] is the code behind [http://www.youtube.com/watch?v=VekgyKQoTeM kiba dock]'s fun and dynamic behaviour. It's dependencies are light (needs just GLib). It takes elasticity, friction, gravity into account.&lt;br /&gt;
&lt;br /&gt;
If you want to take a quick look at the code:&lt;br /&gt;
svn co http://svn.kiba-dock.org/akamaru/ akamaru&lt;br /&gt;
&lt;br /&gt;
The only (AFAIK) application using this library is kiba-dock, a *fun* app launcher, but we may find another use to it in the future.&lt;br /&gt;
&lt;br /&gt;
As suggested on the mailing list, it is mostly overkill for the uses we intend to have, but this library may be optimized already, the API can spare some time for too. Furthermore, ''Qui peut le plus, peut le moins''.&lt;br /&gt;
&lt;br /&gt;
====Verlet integration implementation from e17====&lt;br /&gt;
&lt;br /&gt;
There's an undergoing verlet integration implementation into the e17 project (by rephorm) see http://rephorm.com/news/tag/physics , so we may see some UI physics integration into e17 someday.&lt;br /&gt;
&lt;br /&gt;
====Robert Pernner's easy equations====&lt;br /&gt;
&lt;br /&gt;
http://www.robertpenner.com/easing/&lt;br /&gt;
&lt;br /&gt;
See the demo: implements non linear behaviour (actionscript), but may give inspiration&lt;br /&gt;
&lt;br /&gt;
===Extending the touchscreen capabilities and input methods===&lt;br /&gt;
&lt;br /&gt;
* '''Multitouchscreen emulation'''&lt;br /&gt;
&lt;br /&gt;
If we got it right, when touching the screen on a second place, the cursor oscillates between the two points depending on relative pressure distribution. Using averaging algorithms, we may have the opportunity to detect peculiar behaviours.&lt;br /&gt;
&lt;br /&gt;
We need raw data (x,y,t) from the real hardware for the following behaviours:&lt;br /&gt;
* slide two fingers in parallel - vertical up/down (scroll)&lt;br /&gt;
* turn the two fingers around (rotate)&lt;br /&gt;
* slide two fingers towards each other (zoom-)&lt;br /&gt;
* slide two fingers apart (zoom+)&lt;br /&gt;
&lt;br /&gt;
When touching the screen with two fingers at the same time, we necessarily see the two points, or are able to extrapolate the position of the second one. This solution can add feature, but will probably be little erratic...&lt;br /&gt;
&lt;br /&gt;
* '''Touchscreen kernel module hacking'''&lt;br /&gt;
&lt;br /&gt;
We may correct the &amp;quot;half distance&amp;quot; phenomenon on double touch: if double touch is detected, then assimilate the cursor as twice further than the first touch. It would allow finer control, but higher instability.&lt;br /&gt;
&lt;br /&gt;
The double touch detection may be implemented in the driver itself, as well as stabilization.&lt;br /&gt;
&lt;br /&gt;
* '''Other detectable behaviours'''&lt;br /&gt;
&lt;br /&gt;
The warping can be used in the 4 diagonals, plus the up/down/right/left cross:&lt;br /&gt;
&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
  - 1            -  - 1          2 -  - 1            -  -      2       -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -             2-  -              -  - 2            -  -      1       -&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
&lt;br /&gt;
It's not double touch, but two sequential presses with a short time in between (~0.5 s)&lt;br /&gt;
&lt;br /&gt;
* '''Clever hacks'''&lt;br /&gt;
&lt;br /&gt;
It's been said that having no multitouch screen allows less freedom for innovation. Maybe we could get something out of our touchscreen drivers.&lt;br /&gt;
&lt;br /&gt;
Why ? Think of apple's scroll up/down feature on macbooks touchpads (which '''aren't multi touch''', it's a [http://iscroll2.sourceforge.net/ clever driver hack, iscroll2]):&lt;br /&gt;
&lt;br /&gt;
  To scroll, just place two fingers on your trackpad instead of one. Both fingers&lt;br /&gt;
  need to be placed next to each other horizontally (not vertically, the trackpad &lt;br /&gt;
  cannot detect that). Some people get better results with their finger spaced a&lt;br /&gt;
  little bit apart, while others prefer having the fingers right next to each other.&lt;br /&gt;
&lt;br /&gt;
  iScroll2 provides two scrolling modes: Linear and circular scrolling.&lt;br /&gt;
&lt;br /&gt;
  For linear scrolling, move the two fingers up/down or left/right in a straight &lt;br /&gt;
  line, respectively, to scroll in that direction.&lt;br /&gt;
&lt;br /&gt;
  Circular scrolling works in a way similar to the iPod's scroll wheel: Move the two&lt;br /&gt;
  fingers in a circle to scroll up or down, depending   on whether you move in a &lt;br /&gt;
  clockwise or counterclockwise direction.&lt;br /&gt;
&lt;br /&gt;
Maybe we can port/adapt/get inspiration from this macintosh driver.&lt;br /&gt;
&lt;br /&gt;
===Improved virtual keyboard===&lt;br /&gt;
&lt;br /&gt;
One nice idea for virtual input is [http://www.micropp.se/openmoko/ finger-splash]&lt;br /&gt;
&lt;br /&gt;
Yet, optimization does not only apply to the plain one-letter-at-a-time input. We need some sort of T9 (dictionary-based input help). When typing a word, the first letter determines the next possible ones. Therefore, we may let disappear the less-probable following letters. Ex: type an L, there's no way an X follows...&lt;br /&gt;
&lt;br /&gt;
Hints: &lt;br /&gt;
* ZIP's huffmann compression applied to SMSs/mails for detecting the most used characters/words/sentences.&lt;br /&gt;
* html tag-clouds, one-letter tag clouds ; font size proportional to the probability of being used&lt;br /&gt;
&lt;br /&gt;
The most critical point is the initial disposition of the letters, before any letter is typed. We may also want to use horizontal two-parts keyboard (with the neo in hands like a psp..)&lt;br /&gt;
&lt;br /&gt;
The [http://www.strout.net/info/ideas/hexinput.html hexinput] concept is interesting. What about hiding the less probable letters and increasing the remaining ones during typing?&lt;br /&gt;
&lt;br /&gt;
===Towards OpenGL compositing===&lt;br /&gt;
&lt;br /&gt;
There are [http://www.hbmobile.org/wiki/index.php?title=GUI_Frameworks lots of possible GUI frameworks] with various software architectures that could be used for OpenMoko.&lt;br /&gt;
&lt;br /&gt;
GTA01 hardware uses GTK+/matchbox without hardware acceleration, and it's not enough: this is a first that a mobile Linux device has such a high DPI resolution. OpenGL ES compositing seems to have a bright future on embedded devices, because compositing seems to give natural zooming interfaces reality (at last!).&lt;br /&gt;
&lt;br /&gt;
Considering recent changes in destkop applications, opengl has a definite future. For instance, the expose (be it apple's or beryl's) is a very interesting and usable feature. Using compositing allows the physics metaphore: '''the human brain doesn't like &amp;quot;gaps&amp;quot;/jumps (for instance while scrolling a text), it needs continuity''', which can be provided by opengl. When you look at apple's iphone prototype, it's not just eye candy, it's maybe the most natural/human way of navigating, because it's sufficiently realistic for the brain to forget the non-physical nature of what's inside.&lt;br /&gt;
&lt;br /&gt;
So, opengl hardware will be needed in a more or less distant hardware, for 100% fluid operation. Benchmarking will be needed to compare the different alternatives that are cited further.&lt;br /&gt;
&lt;br /&gt;
====The Enlightenment Foundation Libraries====&lt;br /&gt;
&lt;br /&gt;
EFL's Evas is a powerful and power sparing canvas drawing library. It can be OpenGL accelerated. Python/Ruby bindings are available in the &amp;quot;proto&amp;quot; e17 cvs folder.&lt;br /&gt;
&lt;br /&gt;
''Moved [[E17|here]]''&lt;br /&gt;
&lt;br /&gt;
====Clutter Toolkit====&lt;br /&gt;
&lt;br /&gt;
Clutter, an [http://o-hand.com/ OpenedHand] project, is an open source software library for creating fast, visually rich graphical user interfaces. The most obvious example of potential usage is in media center type applications.&lt;br /&gt;
&lt;br /&gt;
http://clutter-project.org/&lt;br /&gt;
&lt;br /&gt;
Clutter uses OpenGL (and optionally '''OpenGL ES''') for rendering but with an API which hides the underlying GL complexity from the developer. The Clutter API is intended to be easy to use, efficient and flexible.&lt;br /&gt;
&lt;br /&gt;
It does integrate gstreamer (for easy media playback, even camera or mic inputs), allows pango text rendering, cairo graphics rendering. Provided bindings are python, C# and Ruby.&lt;br /&gt;
&lt;br /&gt;
GTK off screen rendering is supposed to be on it's way; once it is here, there will be a possibility of using GTK apps directly within OpenGL apps as textures, which would lead to the possibility of creating a full OpenGL &amp;quot;application manager&amp;quot; (as well as media consuming app) with ZUI features.&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C, OpenGL&lt;br /&gt;
* Bindings: Python, C#, Ruby&lt;br /&gt;
* Backends: GLX / SDL / EGL&lt;br /&gt;
* Media support: Gstreamer integration, Cairo graphics rendering, Pango fonts rendering&lt;br /&gt;
* Embedding: GTK embedding&lt;br /&gt;
&lt;br /&gt;
====Graff====&lt;br /&gt;
&lt;br /&gt;
An early demonstration of Graff, which ''is a lighweight high-performance graphics rendering library.''&lt;br /&gt;
http://www.mdk.org.pl/articles/2007/04/23/chapter-1-in-which-we-meet-graff&lt;br /&gt;
&lt;br /&gt;
Be sure to check out this demo (scrolling list with inertia scrolling)&lt;br /&gt;
http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Of course it will remind you of Apple iPhone's UI. But this one runs in software mode on Nokia N770&amp;amp;800 already. The most notable part of Graff seems to be the inertia and physics integration in general.&lt;br /&gt;
&lt;br /&gt;
====Pigment API====&lt;br /&gt;
&lt;br /&gt;
Fluendo's (the Gstreamer guys) ''[https://core.fluendo.com/pigment/trac Pigment] is a Python library designed to easily build user interfaces with embedded multimedia. Its design allows to use it on several platforms, thanks to a plugin system allowing to choose the underlying graphical API. Pigment is the rendering engine of Elisa, the Fluendo Media Center project.''&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C OpenGL&lt;br /&gt;
* Bindings: Python&lt;br /&gt;
* Backends: DirectFB OpenGL&lt;br /&gt;
* Media playback integration: using Gstreamer&lt;br /&gt;
&lt;br /&gt;
===Choosing===&lt;br /&gt;
&lt;br /&gt;
Benchmarking will be needed. We have therefore to define a std testing application that would allow to compare alternatives. &lt;br /&gt;
&lt;br /&gt;
Some Clutter VS Pigment information: http://www.taimila.com/?q=node/14&lt;br /&gt;
&lt;br /&gt;
==Improvement ideas==&lt;br /&gt;
&lt;br /&gt;
Please add here any idea that seems of relevance.&lt;br /&gt;
&lt;br /&gt;
===1D list scrolling: looped physics-driven item list===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
&lt;br /&gt;
[EDIT] Graff's inertia scrolling list example: http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
====Controls====&lt;br /&gt;
&lt;br /&gt;
* Sliding up/down = Single click + maintained for a minimal distance&lt;br /&gt;
&lt;br /&gt;
Effect: scroll in an inverted/negated fashion (slide down = scroll up, slide up = scroll down)&lt;br /&gt;
&lt;br /&gt;
When finger is released (i.e. touchscreen doesn't detect any press):&lt;br /&gt;
  if (last_speed_seen &amp;gt; 0 ) then keep this speed and acceleration, with friction&lt;br /&gt;
  else stop scrolling&lt;br /&gt;
&lt;br /&gt;
Scrolling here is seen as unidimensional, but can apply to bidimensional situations (ex: zoomed image) too&lt;br /&gt;
&lt;br /&gt;
* Action = quick double tap&lt;br /&gt;
&lt;br /&gt;
* Details/select = short single tap&lt;br /&gt;
&lt;br /&gt;
* Right click = long tap&lt;br /&gt;
&lt;br /&gt;
* Sliding left/right: switch sorting method&lt;br /&gt;
&lt;br /&gt;
====Parts to modify====&lt;br /&gt;
&lt;br /&gt;
''Having a scroll that isn't a 1:1 map to the user's action isn't hard. It's just an extra calculation in the scroll code.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;---- Where is the scroll code? :)&lt;br /&gt;
&lt;br /&gt;
* libmokoui&lt;br /&gt;
** [[Stylus_Scrolling | Stylus scrolling widget]]&lt;br /&gt;
** [[Finger_Scrolling | Finger scrolling wheel widget]]&lt;br /&gt;
* gtk&lt;br /&gt;
** [http://www.gtk.org/api/2.6/gtk/GtkVScrollbar.html GtkVScrollbar]&lt;br /&gt;
&lt;br /&gt;
The best would be to add the feature for both finger and stylus scrolling.&lt;br /&gt;
&lt;br /&gt;
TODO:&lt;br /&gt;
* make the entire list a &amp;quot;scrolling zone&amp;quot;, i.e. an overlay transparent scrolling widget?&lt;br /&gt;
* define controls&lt;br /&gt;
* add the inertia feature&lt;br /&gt;
&lt;br /&gt;
===1D Scrolling: inertia friction integration into openmoko's finger wheel=== &lt;br /&gt;
&lt;br /&gt;
The same, but for the wheel. It can be very short to do: you don't have 1:1 anymore, but, for example, 1/4 wheel turn = 1 item. It's demultiplicated, but has inertia.&lt;br /&gt;
&lt;br /&gt;
===Left-handed UI Support===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
A discussion on the community list identified a desire to have the ability to switch the OpenMoko UI into &amp;quot;left-handed&amp;quot; mode.  &lt;br /&gt;
&lt;br /&gt;
 The main problem is scrollbars, when they're on the right, dragging  &lt;br /&gt;
 the scrollbar left handed results in your hand covering the screen so  &lt;br /&gt;
 you can't see what you are doing. So having the option of scrollbars  &lt;br /&gt;
 on the left would be useful.&lt;br /&gt;
&lt;br /&gt;
 I don't think the whole screen should be mirrored! There are some elements&lt;br /&gt;
 that should remain..like the main top bar with the status icons and such.&lt;br /&gt;
 Scrollbars are the main thing I can think of right now.&lt;br /&gt;
&lt;br /&gt;
===Handgesture recognition proposals===&lt;br /&gt;
&lt;br /&gt;
====Using simple, localized warp as modifier key====&lt;br /&gt;
&lt;br /&gt;
As discussed on community list:&lt;br /&gt;
&lt;br /&gt;
  If you hold down one finger and tap the other one, the mouse pops over and back&lt;br /&gt;
  again. If you keep your second finger touching, the cursor follows it. When you&lt;br /&gt;
  release it, cursor goes back to first finger position. This could be a way to&lt;br /&gt;
  set a bounding box or turn on the mode. So the second finger can do something&lt;br /&gt;
  like rotating around the first, or increase or lower the distance to the first.&lt;br /&gt;
&lt;br /&gt;
* the so-called &amp;quot;first touch&amp;quot; can be done on the mokowheel zone itself: put your left thumb on the black area; if you touch the screen with another finger, there is a '''warp'''; the warp is detectable and allows to enter &amp;quot;fake multi-touchscreen mode&amp;quot;&lt;br /&gt;
* afterwards,&lt;br /&gt;
     * slide your right-hand finger down, it scrolls up&lt;br /&gt;
     * slide your right-hand finger up, it scrolls down&lt;br /&gt;
     * slide it left, next page/item&lt;br /&gt;
     * slide it right, previous page/item&lt;br /&gt;
     * do a circle: rotation&lt;br /&gt;
     * narrow towards the black circle: zoom -&lt;br /&gt;
     * go away: zoom +&lt;br /&gt;
* if you had kept your first finger on the black quarter circle, you can continue issuing other gestures&lt;br /&gt;
&lt;br /&gt;
The advantages of using simple origin-driven cursor warping as double touch detection criteria is that:&lt;br /&gt;
* you don't have to use the wheel as button, which would slow things down and generate errors (false button presses)&lt;br /&gt;
* simpler detection algorithms that can pass by the fluctuation due to pressure relative distribution&lt;br /&gt;
* the space taken by the wheel itself is &amp;quot;useless&amp;quot; (i.e. displays no information); using it as modifier allows to keep the screen clean for reading&lt;br /&gt;
* the origin of this zone lets use maximum surface of the screen, allowing more fine controlling&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_rotate_right.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_previous.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_down.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_zoom-.png]]&lt;br /&gt;
&lt;br /&gt;
*Pros:&lt;br /&gt;
** who said we need multi-touch hardware?&lt;br /&gt;
** this may be the easiest way (in terms of design/implementation complexity, reliability)&lt;br /&gt;
*Cons: &lt;br /&gt;
** no matter what we'll invent, we'll need two hands for on-the-move controlling&lt;br /&gt;
** what about left-handed people?&lt;br /&gt;
&lt;br /&gt;
====What is to modify ?====&lt;br /&gt;
&lt;br /&gt;
We need to emulate key presses. We need to work at a layer where we can get raw cursor coordinates. &amp;lt;---- X server layer?&lt;br /&gt;
&lt;br /&gt;
There is a fake keyboard module (for dev purposes) in the main kernel tree, which could be used to simulate keyboard presses (hence keeping keyboard-enabled apps unmodified).&lt;br /&gt;
&lt;br /&gt;
====Full multi-touch emulation====&lt;br /&gt;
&lt;br /&gt;
Doable, but tricky...&lt;br /&gt;
&lt;br /&gt;
==Preparing the multi touch==&lt;br /&gt;
&lt;br /&gt;
One day we might get multitouch devices. Let's get ready.&lt;br /&gt;
&lt;br /&gt;
===MPX===&lt;br /&gt;
 	&lt;br /&gt;
The Multi-Pointer X Server is a modification of the X server to support multiple mice and keyboards in X. It provides users with one cursor per device and one keyboard focus per keyboard. Each cursor can operate independently. MPX is the first multicursor windowing system and allows two-handed interaction with legacy applications, but also the creation of innovative applications and user interfaces. &lt;br /&gt;
&lt;br /&gt;
[http://wearables.unisa.edu.au/mpx/ The multipoint X server project]&lt;br /&gt;
&lt;br /&gt;
===MacSlow's Lowfat getting multitouched===&lt;br /&gt;
&lt;br /&gt;
http://dlai.jafu.dk/?p=1&lt;br /&gt;
&lt;br /&gt;
==Open questions==&lt;br /&gt;
&lt;br /&gt;
* will the neo/openmoko graphics system be powerful enough for such uses? I apple uses an OpenGL ES acceleration on this device (as well as on recent iPods), which is on the way with [[GTA02#.22Phase_2.22_.28GTA02.2C_.22Mass_Market.22.29|GTA02]].&lt;br /&gt;
* how does the touchscreen behave? We need a detailed touchscreen wiki information page, with visual traces. How hardware-specific is it?&lt;br /&gt;
* is multi touch really that awesome? I guess not.&lt;br /&gt;
&lt;br /&gt;
{{Languages|UI Improvements}}&lt;br /&gt;
&lt;br /&gt;
[[Category:User Interfaces| ]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/UI_Improvements</id>
		<title>UI Improvements</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/UI_Improvements"/>
				<updated>2007-07-27T17:19:31Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Clever hacks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
  Obviously the tools are in the wild to build interfaces that could rival&lt;br /&gt;
  (or better IMO) anything Apple comes up with. We just need to organize&lt;br /&gt;
  this stuff. This would need hardware that can support dynamic&lt;br /&gt;
  interfaces. I can help here, too.&lt;br /&gt;
  sean@openmoko.com&lt;br /&gt;
&lt;br /&gt;
In fact, this place shall be dedicated to human-machine interactions improvements discussion;&lt;br /&gt;
&lt;br /&gt;
Human-machine interaction can be separated into several aspects:&lt;br /&gt;
* the physical contact/input device: the mono-touch touchscreen&lt;br /&gt;
* the graphics: &lt;br /&gt;
** accelerated rendering can add more consistency to zooming user interfaces, which seem to be quite an interesting concept for embedded scrensize-limited devices&lt;br /&gt;
** adding physics &amp;quot;look and feel&amp;quot; to (ex: menu's) behaviours can add coherence too&lt;br /&gt;
* the input methods&lt;br /&gt;
** the virtual keyboard&lt;br /&gt;
** handgestures&lt;br /&gt;
&lt;br /&gt;
==Finding inspiration ...==&lt;br /&gt;
&lt;br /&gt;
===Seen Live===&lt;br /&gt;
&lt;br /&gt;
'''Multi-touch'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=89sz8ExZndc Multi-Touchscreen experiments video @youtube]&lt;br /&gt;
*[http://www.youtube.com/watch?v=nPqqfVLQ_qY iPhone UI features demo @youtube]&lt;br /&gt;
* Multi-touch on Linux with [http://www.youtube.com/watch?v=olWjnfBoY8E MPX]&lt;br /&gt;
&lt;br /&gt;
'''Zooming user interfaces'''&lt;br /&gt;
*[http://www.zenzui.com/products.html ZenZui], a [http://en.wikipedia.org/wiki/ZUI ZUI (zooming user interface)]&lt;br /&gt;
*[http://labs.live.com/Deepfish/videos.aspx Microsoft Bluefish's ZUI] (new mobile webbrowser)&lt;br /&gt;
*[http://googlesystem.blogspot.com/2007/04/opera-920-more-homepages-at-your.html Opera speed dial]&lt;br /&gt;
&lt;br /&gt;
'''Graphics'''&lt;br /&gt;
*[http://www.rasterman.com/files/eem.avi EEM], Rasterman's EFL libs on handelds proof of concept (doesn't DO anything, just showing off the EFLs on a handeld)&lt;br /&gt;
*[http://www.youtube.com/watch?v=8kLFPfaxQ6U&amp;amp;eurl= Nvidia's cutting-edge techno], an [http://www.khronos.org/openkode/ Openkode] demo&lt;br /&gt;
*[http://files.mdk.am/demos/graff-demo-3.avi Graff]'s inertia scroll list&lt;br /&gt;
&lt;br /&gt;
'''Science fiction'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=G_FS2TiK3AI UPMC Future?]&lt;br /&gt;
&lt;br /&gt;
'''Links:'''&lt;br /&gt;
*[http://elevate.sourceforge.net/links.html elevate project's links] sums up quite greatly the latest innovations in the desktop area&lt;br /&gt;
*[http://nooface.net/ Nooface] is a human-machine news site&lt;br /&gt;
*Asus-Intel's [http://www.hothardware.com/articles/Hands_on_with_the_ASUS_Eee/?page=2 Eee]'s interface&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===n-D navigation: the polyhedra inspiration===&lt;br /&gt;
&lt;br /&gt;
When we want to navigate files, mp3s in an mp3 player, etc... Every control that the application needs is a button. What about looking at the polyhedrons? We could find one for each usage, with as many surrounding subzones that may be used as controls. Ex: you need 5 buttons, let's take a pentagon with 5 surrounding zones all around. That way, it's always optimized...&lt;br /&gt;
&lt;br /&gt;
http://en.wikipedia.org/wiki/Polyhedra&lt;br /&gt;
http://en.wikipedia.org/wiki/List_of_uniform_polyhedra&lt;br /&gt;
&lt;br /&gt;
===Our weapons===&lt;br /&gt;
&lt;br /&gt;
We can't improve the human-machine interface without knowing the strengths / weaknesses of our hardware; some of the weaknesses might turn out as exploitable features, some strengths as limiting constraints.&lt;br /&gt;
&lt;br /&gt;
====The touchscreen====&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What exactly does the touchscreen see when  you touch the screen with 2 fingers&lt;br /&gt;
  at the same time, when you move them, when you move only one of the 2, etc. I'm &lt;br /&gt;
  also interested in knowing how precise the touchscreen is (ex: refresh rate, &lt;br /&gt;
  possible pressure indication, ...)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* The output is the center of the bounding box of the touched area&lt;br /&gt;
* The touch point skips instantly on double touch&lt;br /&gt;
* Pressure has almost no effect on a single touch, but not so on a double touch. The relative pressures will cause a significant skewing effect towards the harder touch. You can easily move the pointer along the line between your two fingers by changing the relative pressure.&lt;br /&gt;
&lt;br /&gt;
Conclusions:&lt;br /&gt;
* we can detect double touch as jumps, and that's all&lt;br /&gt;
* no pressure&lt;br /&gt;
* This could be an interesting input method for games - e.g. holding the Neo in landscape view, letting each thumb rest on a specific input area; probably needs to be checked for usability with a real device&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when sliding two fingers in parallel up(L,R)-&amp;gt;down(L,R)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see a slide along the center line between your two fingers. In practice, you can't keep the pressure equal, so you will see some kind of zig-zag line somewhere between the two pressure points in the direction of your slide.&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when narrowing two fingers in slide (=zoom effect on iphone)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see the pointer stay at the center of the zoom movement. In practice, you can't keep the pressure equal for both fingers, so the pointer will move towards one of the two pressure points.&lt;br /&gt;
&lt;br /&gt;
====Graphics and computational capabilities====&lt;br /&gt;
&lt;br /&gt;
It would be good to report what performance the current hardware allows:&lt;br /&gt;
* There was no pure X11 benchmarking done (AFAIK) (how many fps at full VGA scrolling, ex: 1024*480 image scrolling?)&lt;br /&gt;
* what about the lcd reactivity? What if we don't see anything but blur while moving items fast?&lt;br /&gt;
&lt;br /&gt;
Please report here your impressions.&lt;br /&gt;
&lt;br /&gt;
==Areas of improvement==&lt;br /&gt;
&lt;br /&gt;
* OpenGL for fluid zooming interfaces (2D: the infinite sphere model, 1D: the infinite wheel of fortune/ribbon model, exposé)&lt;br /&gt;
* HandGestures&lt;br /&gt;
* Physics-model based improvements: inertia and friction&lt;br /&gt;
* multi touch screen for natural handgestures &lt;br /&gt;
* improved virtual keyboard&lt;br /&gt;
* switching to another GUI toolkit (EFLs)&lt;br /&gt;
&lt;br /&gt;
===Physics-inspired animation a.k.a. &amp;quot;Digital Physics&amp;quot;===&lt;br /&gt;
&lt;br /&gt;
If we want to add eye candy &amp;amp; usability to the UI (such as smooth realistic list scrolling, as seen in apple's&lt;br /&gt;
iphone demo on contacts lists for instance), we'll need a physics engine, so that moves &amp;amp; animations aren't all linear.&lt;br /&gt;
&lt;br /&gt;
The following aticle explains the [http://www.readwriteweb.com/archives/the_physics_of_iphone.php Digital Physics] term from the iPhone example.&lt;br /&gt;
&lt;br /&gt;
The most used technique for calculating trajectories and systems of related geometrical objects seems to be [http://en.wikipedia.org/wiki/Verlet_integration verlet integration] implementation; it is an alternative to Euler's integration method, using fast approximation. &lt;br /&gt;
&lt;br /&gt;
We may have no need for such a mathematical method at first, but perhaps there are other use cases. For instance, it may be useful to gesture recognition (i'm not aware if existing gesture recognition engines measure speed, acceleration...).&lt;br /&gt;
&lt;br /&gt;
====Open Dynamics Engine====&lt;br /&gt;
&lt;br /&gt;
ODE is an open source, high performance library for simulating rigid body dynamics. It is fully featured, stable, mature and platform independent with an easy to use C/C++ API. It has advanced joint types and integrated collision detection with friction. ODE is useful for simulating vehicles, objects in virtual reality environments and virtual creatures. It is currently used in many computer games, 3D authoring tools and simulation tools.&lt;br /&gt;
&lt;br /&gt;
http://www.ode.org/&lt;br /&gt;
&lt;br /&gt;
====Libakamaru====&lt;br /&gt;
&lt;br /&gt;
The [http://people.freedesktop.org/~krh/akamaru.git/ akamaru library] is the code behind [http://www.youtube.com/watch?v=VekgyKQoTeM kiba dock]'s fun and dynamic behaviour. It's dependencies are light (needs just GLib). It takes elasticity, friction, gravity into account.&lt;br /&gt;
&lt;br /&gt;
If you want to take a quick look at the code:&lt;br /&gt;
svn co http://svn.kiba-dock.org/akamaru/ akamaru&lt;br /&gt;
&lt;br /&gt;
The only (AFAIK) application using this library is kiba-dock, a *fun* app launcher, but we may find another use to it in the future.&lt;br /&gt;
&lt;br /&gt;
As suggested on the mailing list, it is mostly overkill for the uses we intend to have, but this library may be optimized already, the API can spare some time for too. Furthermore, ''Qui peut le plus, peut le moins''.&lt;br /&gt;
&lt;br /&gt;
====Verlet integration implementation from e17====&lt;br /&gt;
&lt;br /&gt;
There's an undergoing verlet integration implementation into the e17 project (by rephorm) see http://rephorm.com/news/tag/physics , so we may see some UI physics integration into e17 someday.&lt;br /&gt;
&lt;br /&gt;
====Robert Pernner's easy equations====&lt;br /&gt;
&lt;br /&gt;
http://www.robertpenner.com/easing/&lt;br /&gt;
&lt;br /&gt;
See the demo: implements non linear behaviour (actionscript), but may give inspiration&lt;br /&gt;
&lt;br /&gt;
===Extending the touchscreen capabilities and input methods===&lt;br /&gt;
&lt;br /&gt;
* '''Multitouchscreen emulation'''&lt;br /&gt;
&lt;br /&gt;
If we got it right, when touching the screen on a second place, the cursor oscillates between the two points depending on relative pressure distribution. Using averaging algorithms, we may have the opportunity to detect peculiar behaviours.&lt;br /&gt;
&lt;br /&gt;
We need raw data (x,y,t) from the real hardware for the following behaviours:&lt;br /&gt;
* slide two fingers in parallel - vertical up/down (scroll)&lt;br /&gt;
* turn the two fingers around (rotate)&lt;br /&gt;
* slide two fingers towards each other (zoom-)&lt;br /&gt;
* slide two fingers apart (zoom+)&lt;br /&gt;
&lt;br /&gt;
When touching the screen with two fingers at the same time, we necessarily see the two points, or are able to extrapolate the position of the second one. This solution can add feature, but will probably be little erratic...&lt;br /&gt;
&lt;br /&gt;
* '''Touchscreen kernel module hacking'''&lt;br /&gt;
&lt;br /&gt;
We may correct the &amp;quot;half distance&amp;quot; phenomenon on double touch: if double touch is detected, then assimilate the cursor as twice further than the first touch. It would allow finer control, but higher instability.&lt;br /&gt;
&lt;br /&gt;
The double touch detection may be implemented in the driver itself, as well as stabilization.&lt;br /&gt;
&lt;br /&gt;
* '''Other detectable behaviours'''&lt;br /&gt;
&lt;br /&gt;
The warping can be used in the 4 diagonals, plus the up/down/right/left cross:&lt;br /&gt;
&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
  - 1            -  - 1          2 -  - 1            -  -      2       -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -             2-  -              -  - 2            -  -      1       -&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
&lt;br /&gt;
It's not double touch, but two sequential presses with a short time in between (~0.5 s)&lt;br /&gt;
&lt;br /&gt;
===Improved virtual keyboard===&lt;br /&gt;
&lt;br /&gt;
One nice idea for virtual input is [http://www.micropp.se/openmoko/ finger-splash]&lt;br /&gt;
&lt;br /&gt;
Yet, optimization does not only apply to the plain one-letter-at-a-time input. We need some sort of T9 (dictionary-based input help). When typing a word, the first letter determines the next possible ones. Therefore, we may let disappear the less-probable following letters. Ex: type an L, there's no way an X follows...&lt;br /&gt;
&lt;br /&gt;
Hints: &lt;br /&gt;
* ZIP's huffmann compression applied to SMSs/mails for detecting the most used characters/words/sentences.&lt;br /&gt;
* html tag-clouds, one-letter tag clouds ; font size proportional to the probability of being used&lt;br /&gt;
&lt;br /&gt;
The most critical point is the initial disposition of the letters, before any letter is typed. We may also want to use horizontal two-parts keyboard (with the neo in hands like a psp..)&lt;br /&gt;
&lt;br /&gt;
The [http://www.strout.net/info/ideas/hexinput.html hexinput] concept is interesting. What about hiding the less probable letters and increasing the remaining ones during typing?&lt;br /&gt;
&lt;br /&gt;
===Towards OpenGL compositing===&lt;br /&gt;
&lt;br /&gt;
There are [http://www.hbmobile.org/wiki/index.php?title=GUI_Frameworks lots of possible GUI frameworks] with various software architectures that could be used for OpenMoko.&lt;br /&gt;
&lt;br /&gt;
GTA01 hardware uses GTK+/matchbox without hardware acceleration, and it's not enough: this is a first that a mobile Linux device has such a high DPI resolution. OpenGL ES compositing seems to have a bright future on embedded devices, because compositing seems to give natural zooming interfaces reality (at last!).&lt;br /&gt;
&lt;br /&gt;
Considering recent changes in destkop applications, opengl has a definite future. For instance, the expose (be it apple's or beryl's) is a very interesting and usable feature. Using compositing allows the physics metaphore: '''the human brain doesn't like &amp;quot;gaps&amp;quot;/jumps (for instance while scrolling a text), it needs continuity''', which can be provided by opengl. When you look at apple's iphone prototype, it's not just eye candy, it's maybe the most natural/human way of navigating, because it's sufficiently realistic for the brain to forget the non-physical nature of what's inside.&lt;br /&gt;
&lt;br /&gt;
So, opengl hardware will be needed in a more or less distant hardware, for 100% fluid operation. Benchmarking will be needed to compare the different alternatives that are cited further.&lt;br /&gt;
&lt;br /&gt;
====The Enlightenment Foundation Libraries====&lt;br /&gt;
&lt;br /&gt;
EFL's Evas is a powerful and power sparing canvas drawing library. It can be OpenGL accelerated. Python/Ruby bindings are available in the &amp;quot;proto&amp;quot; e17 cvs folder.&lt;br /&gt;
&lt;br /&gt;
''Moved [[E17|here]]''&lt;br /&gt;
&lt;br /&gt;
====Clutter Toolkit====&lt;br /&gt;
&lt;br /&gt;
Clutter, an [http://o-hand.com/ OpenedHand] project, is an open source software library for creating fast, visually rich graphical user interfaces. The most obvious example of potential usage is in media center type applications.&lt;br /&gt;
&lt;br /&gt;
http://clutter-project.org/&lt;br /&gt;
&lt;br /&gt;
Clutter uses OpenGL (and optionally '''OpenGL ES''') for rendering but with an API which hides the underlying GL complexity from the developer. The Clutter API is intended to be easy to use, efficient and flexible.&lt;br /&gt;
&lt;br /&gt;
It does integrate gstreamer (for easy media playback, even camera or mic inputs), allows pango text rendering, cairo graphics rendering. Provided bindings are python, C# and Ruby.&lt;br /&gt;
&lt;br /&gt;
GTK off screen rendering is supposed to be on it's way; once it is here, there will be a possibility of using GTK apps directly within OpenGL apps as textures, which would lead to the possibility of creating a full OpenGL &amp;quot;application manager&amp;quot; (as well as media consuming app) with ZUI features.&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C, OpenGL&lt;br /&gt;
* Bindings: Python, C#, Ruby&lt;br /&gt;
* Backends: GLX / SDL / EGL&lt;br /&gt;
* Media support: Gstreamer integration, Cairo graphics rendering, Pango fonts rendering&lt;br /&gt;
* Embedding: GTK embedding&lt;br /&gt;
&lt;br /&gt;
====Graff====&lt;br /&gt;
&lt;br /&gt;
An early demonstration of Graff, which ''is a lighweight high-performance graphics rendering library.''&lt;br /&gt;
http://www.mdk.org.pl/articles/2007/04/23/chapter-1-in-which-we-meet-graff&lt;br /&gt;
&lt;br /&gt;
Be sure to check out this demo (scrolling list with inertia scrolling)&lt;br /&gt;
http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Of course it will remind you of Apple iPhone's UI. But this one runs in software mode on Nokia N770&amp;amp;800 already. The most notable part of Graff seems to be the inertia and physics integration in general.&lt;br /&gt;
&lt;br /&gt;
====Pigment API====&lt;br /&gt;
&lt;br /&gt;
Fluendo's (the Gstreamer guys) ''[https://core.fluendo.com/pigment/trac Pigment] is a Python library designed to easily build user interfaces with embedded multimedia. Its design allows to use it on several platforms, thanks to a plugin system allowing to choose the underlying graphical API. Pigment is the rendering engine of Elisa, the Fluendo Media Center project.''&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C OpenGL&lt;br /&gt;
* Bindings: Python&lt;br /&gt;
* Backends: DirectFB OpenGL&lt;br /&gt;
* Media playback integration: using Gstreamer&lt;br /&gt;
&lt;br /&gt;
===Choosing===&lt;br /&gt;
&lt;br /&gt;
Benchmarking will be needed. We have therefore to define a std testing application that would allow to compare alternatives. &lt;br /&gt;
&lt;br /&gt;
Some Clutter VS Pigment information: http://www.taimila.com/?q=node/14&lt;br /&gt;
&lt;br /&gt;
==Improvement ideas==&lt;br /&gt;
&lt;br /&gt;
Please add here any idea that seems of relevance.&lt;br /&gt;
&lt;br /&gt;
===1D list scrolling: looped physics-driven item list===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
&lt;br /&gt;
[EDIT] Graff's inertia scrolling list example: http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
====Controls====&lt;br /&gt;
&lt;br /&gt;
* Sliding up/down = Single click + maintained for a minimal distance&lt;br /&gt;
&lt;br /&gt;
Effect: scroll in an inverted/negated fashion (slide down = scroll up, slide up = scroll down)&lt;br /&gt;
&lt;br /&gt;
When finger is released (i.e. touchscreen doesn't detect any press):&lt;br /&gt;
  if (last_speed_seen &amp;gt; 0 ) then keep this speed and acceleration, with friction&lt;br /&gt;
  else stop scrolling&lt;br /&gt;
&lt;br /&gt;
Scrolling here is seen as unidimensional, but can apply to bidimensional situations (ex: zoomed image) too&lt;br /&gt;
&lt;br /&gt;
* Action = quick double tap&lt;br /&gt;
&lt;br /&gt;
* Details/select = short single tap&lt;br /&gt;
&lt;br /&gt;
* Right click = long tap&lt;br /&gt;
&lt;br /&gt;
* Sliding left/right: switch sorting method&lt;br /&gt;
&lt;br /&gt;
====Parts to modify====&lt;br /&gt;
&lt;br /&gt;
''Having a scroll that isn't a 1:1 map to the user's action isn't hard. It's just an extra calculation in the scroll code.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;---- Where is the scroll code? :)&lt;br /&gt;
&lt;br /&gt;
* libmokoui&lt;br /&gt;
** [[Stylus_Scrolling | Stylus scrolling widget]]&lt;br /&gt;
** [[Finger_Scrolling | Finger scrolling wheel widget]]&lt;br /&gt;
* gtk&lt;br /&gt;
** [http://www.gtk.org/api/2.6/gtk/GtkVScrollbar.html GtkVScrollbar]&lt;br /&gt;
&lt;br /&gt;
The best would be to add the feature for both finger and stylus scrolling.&lt;br /&gt;
&lt;br /&gt;
TODO:&lt;br /&gt;
* make the entire list a &amp;quot;scrolling zone&amp;quot;, i.e. an overlay transparent scrolling widget?&lt;br /&gt;
* define controls&lt;br /&gt;
* add the inertia feature&lt;br /&gt;
&lt;br /&gt;
===1D Scrolling: inertia friction integration into openmoko's finger wheel=== &lt;br /&gt;
&lt;br /&gt;
The same, but for the wheel. It can be very short to do: you don't have 1:1 anymore, but, for example, 1/4 wheel turn = 1 item. It's demultiplicated, but has inertia.&lt;br /&gt;
&lt;br /&gt;
===Left-handed UI Support===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
A discussion on the community list identified a desire to have the ability to switch the OpenMoko UI into &amp;quot;left-handed&amp;quot; mode.  &lt;br /&gt;
&lt;br /&gt;
 The main problem is scrollbars, when they're on the right, dragging  &lt;br /&gt;
 the scrollbar left handed results in your hand covering the screen so  &lt;br /&gt;
 you can't see what you are doing. So having the option of scrollbars  &lt;br /&gt;
 on the left would be useful.&lt;br /&gt;
&lt;br /&gt;
 I don't think the whole screen should be mirrored! There are some elements&lt;br /&gt;
 that should remain..like the main top bar with the status icons and such.&lt;br /&gt;
 Scrollbars are the main thing I can think of right now.&lt;br /&gt;
&lt;br /&gt;
===Handgesture recognition proposals===&lt;br /&gt;
&lt;br /&gt;
====Using simple, localized warp as modifier key====&lt;br /&gt;
&lt;br /&gt;
As discussed on community list:&lt;br /&gt;
&lt;br /&gt;
  If you hold down one finger and tap the other one, the mouse pops over and back&lt;br /&gt;
  again. If you keep your second finger touching, the cursor follows it. When you&lt;br /&gt;
  release it, cursor goes back to first finger position. This could be a way to&lt;br /&gt;
  set a bounding box or turn on the mode. So the second finger can do something&lt;br /&gt;
  like rotating around the first, or increase or lower the distance to the first.&lt;br /&gt;
&lt;br /&gt;
* the so-called &amp;quot;first touch&amp;quot; can be done on the mokowheel zone itself: put your left thumb on the black area; if you touch the screen with another finger, there is a '''warp'''; the warp is detectable and allows to enter &amp;quot;fake multi-touchscreen mode&amp;quot;&lt;br /&gt;
* afterwards,&lt;br /&gt;
     * slide your right-hand finger down, it scrolls up&lt;br /&gt;
     * slide your right-hand finger up, it scrolls down&lt;br /&gt;
     * slide it left, next page/item&lt;br /&gt;
     * slide it right, previous page/item&lt;br /&gt;
     * do a circle: rotation&lt;br /&gt;
     * narrow towards the black circle: zoom -&lt;br /&gt;
     * go away: zoom +&lt;br /&gt;
* if you had kept your first finger on the black quarter circle, you can continue issuing other gestures&lt;br /&gt;
&lt;br /&gt;
The advantages of using simple origin-driven cursor warping as double touch detection criteria is that:&lt;br /&gt;
* you don't have to use the wheel as button, which would slow things down and generate errors (false button presses)&lt;br /&gt;
* simpler detection algorithms that can pass by the fluctuation due to pressure relative distribution&lt;br /&gt;
* the space taken by the wheel itself is &amp;quot;useless&amp;quot; (i.e. displays no information); using it as modifier allows to keep the screen clean for reading&lt;br /&gt;
* the origin of this zone lets use maximum surface of the screen, allowing more fine controlling&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_rotate_right.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_previous.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_down.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_zoom-.png]]&lt;br /&gt;
&lt;br /&gt;
*Pros:&lt;br /&gt;
** who said we need multi-touch hardware?&lt;br /&gt;
** this may be the easiest way (in terms of design/implementation complexity, reliability)&lt;br /&gt;
*Cons: &lt;br /&gt;
** no matter what we'll invent, we'll need two hands for on-the-move controlling&lt;br /&gt;
** what about left-handed people?&lt;br /&gt;
&lt;br /&gt;
====What is to modify ?====&lt;br /&gt;
&lt;br /&gt;
We need to emulate key presses. We need to work at a layer where we can get raw cursor coordinates. &amp;lt;---- X server layer?&lt;br /&gt;
&lt;br /&gt;
There is a fake keyboard module (for dev purposes) in the main kernel tree, which could be used to simulate keyboard presses (hence keeping keyboard-enabled apps unmodified).&lt;br /&gt;
&lt;br /&gt;
====Full multi-touch emulation====&lt;br /&gt;
&lt;br /&gt;
Doable, but tricky...&lt;br /&gt;
&lt;br /&gt;
==Preparing the multi touch==&lt;br /&gt;
&lt;br /&gt;
One day we might get multitouch devices. Let's get ready.&lt;br /&gt;
&lt;br /&gt;
===MPX===&lt;br /&gt;
 	&lt;br /&gt;
The Multi-Pointer X Server is a modification of the X server to support multiple mice and keyboards in X. It provides users with one cursor per device and one keyboard focus per keyboard. Each cursor can operate independently. MPX is the first multicursor windowing system and allows two-handed interaction with legacy applications, but also the creation of innovative applications and user interfaces. &lt;br /&gt;
&lt;br /&gt;
[http://wearables.unisa.edu.au/mpx/ The multipoint X server project]&lt;br /&gt;
&lt;br /&gt;
===MacSlow's Lowfat getting multitouched===&lt;br /&gt;
&lt;br /&gt;
http://dlai.jafu.dk/?p=1&lt;br /&gt;
&lt;br /&gt;
==Open questions==&lt;br /&gt;
&lt;br /&gt;
* will the neo/openmoko graphics system be powerful enough for such uses? I apple uses an OpenGL ES acceleration on this device (as well as on recent iPods), which is on the way with [[GTA02#.22Phase_2.22_.28GTA02.2C_.22Mass_Market.22.29|GTA02]].&lt;br /&gt;
* how does the touchscreen behave? We need a detailed touchscreen wiki information page, with visual traces. How hardware-specific is it?&lt;br /&gt;
* is multi touch really that awesome? I guess not.&lt;br /&gt;
&lt;br /&gt;
{{Languages|UI Improvements}}&lt;br /&gt;
&lt;br /&gt;
[[Category:User Interfaces| ]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/UI_Improvements</id>
		<title>UI Improvements</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/UI_Improvements"/>
				<updated>2007-07-27T17:19:04Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Seen Live */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
  Obviously the tools are in the wild to build interfaces that could rival&lt;br /&gt;
  (or better IMO) anything Apple comes up with. We just need to organize&lt;br /&gt;
  this stuff. This would need hardware that can support dynamic&lt;br /&gt;
  interfaces. I can help here, too.&lt;br /&gt;
  sean@openmoko.com&lt;br /&gt;
&lt;br /&gt;
In fact, this place shall be dedicated to human-machine interactions improvements discussion;&lt;br /&gt;
&lt;br /&gt;
Human-machine interaction can be separated into several aspects:&lt;br /&gt;
* the physical contact/input device: the mono-touch touchscreen&lt;br /&gt;
* the graphics: &lt;br /&gt;
** accelerated rendering can add more consistency to zooming user interfaces, which seem to be quite an interesting concept for embedded scrensize-limited devices&lt;br /&gt;
** adding physics &amp;quot;look and feel&amp;quot; to (ex: menu's) behaviours can add coherence too&lt;br /&gt;
* the input methods&lt;br /&gt;
** the virtual keyboard&lt;br /&gt;
** handgestures&lt;br /&gt;
&lt;br /&gt;
==Finding inspiration ...==&lt;br /&gt;
&lt;br /&gt;
===Seen Live===&lt;br /&gt;
&lt;br /&gt;
'''Multi-touch'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=89sz8ExZndc Multi-Touchscreen experiments video @youtube]&lt;br /&gt;
*[http://www.youtube.com/watch?v=nPqqfVLQ_qY iPhone UI features demo @youtube]&lt;br /&gt;
* Multi-touch on Linux with [http://www.youtube.com/watch?v=olWjnfBoY8E MPX]&lt;br /&gt;
&lt;br /&gt;
'''Zooming user interfaces'''&lt;br /&gt;
*[http://www.zenzui.com/products.html ZenZui], a [http://en.wikipedia.org/wiki/ZUI ZUI (zooming user interface)]&lt;br /&gt;
*[http://labs.live.com/Deepfish/videos.aspx Microsoft Bluefish's ZUI] (new mobile webbrowser)&lt;br /&gt;
*[http://googlesystem.blogspot.com/2007/04/opera-920-more-homepages-at-your.html Opera speed dial]&lt;br /&gt;
&lt;br /&gt;
'''Graphics'''&lt;br /&gt;
*[http://www.rasterman.com/files/eem.avi EEM], Rasterman's EFL libs on handelds proof of concept (doesn't DO anything, just showing off the EFLs on a handeld)&lt;br /&gt;
*[http://www.youtube.com/watch?v=8kLFPfaxQ6U&amp;amp;eurl= Nvidia's cutting-edge techno], an [http://www.khronos.org/openkode/ Openkode] demo&lt;br /&gt;
*[http://files.mdk.am/demos/graff-demo-3.avi Graff]'s inertia scroll list&lt;br /&gt;
&lt;br /&gt;
'''Science fiction'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=G_FS2TiK3AI UPMC Future?]&lt;br /&gt;
&lt;br /&gt;
'''Links:'''&lt;br /&gt;
*[http://elevate.sourceforge.net/links.html elevate project's links] sums up quite greatly the latest innovations in the desktop area&lt;br /&gt;
*[http://nooface.net/ Nooface] is a human-machine news site&lt;br /&gt;
*Asus-Intel's [http://www.hothardware.com/articles/Hands_on_with_the_ASUS_Eee/?page=2 Eee]'s interface&lt;br /&gt;
&lt;br /&gt;
===Clever hacks===&lt;br /&gt;
&lt;br /&gt;
It's been said that having no multitouch screen allows less freedom for innovation. Maybe we could get something out of our touchscreen drivers.&lt;br /&gt;
&lt;br /&gt;
Why ? Think of apple's scroll up/down feature on macbooks touchpads (which '''aren't multi touch''', it's a [http://iscroll2.sourceforge.net/ clever driver hack, iscroll2]):&lt;br /&gt;
&lt;br /&gt;
  To scroll, just place two fingers on your trackpad instead of one. Both fingers&lt;br /&gt;
  need to be placed next to each other horizontally (not vertically, the trackpad &lt;br /&gt;
  cannot detect that). Some people get better results with their finger spaced a&lt;br /&gt;
  little bit apart, while others prefer having the fingers right next to each other.&lt;br /&gt;
&lt;br /&gt;
  iScroll2 provides two scrolling modes: Linear and circular scrolling.&lt;br /&gt;
&lt;br /&gt;
  For linear scrolling, move the two fingers up/down or left/right in a straight &lt;br /&gt;
  line, respectively, to scroll in that direction.&lt;br /&gt;
&lt;br /&gt;
  Circular scrolling works in a way similar to the iPod's scroll wheel: Move the two&lt;br /&gt;
  fingers in a circle to scroll up or down, depending   on whether you move in a &lt;br /&gt;
  clockwise or counterclockwise direction.&lt;br /&gt;
&lt;br /&gt;
Maybe we can port/adapt/get inspiration from this macintosh driver.&lt;br /&gt;
&lt;br /&gt;
===n-D navigation: the polyhedra inspiration===&lt;br /&gt;
&lt;br /&gt;
When we want to navigate files, mp3s in an mp3 player, etc... Every control that the application needs is a button. What about looking at the polyhedrons? We could find one for each usage, with as many surrounding subzones that may be used as controls. Ex: you need 5 buttons, let's take a pentagon with 5 surrounding zones all around. That way, it's always optimized...&lt;br /&gt;
&lt;br /&gt;
http://en.wikipedia.org/wiki/Polyhedra&lt;br /&gt;
http://en.wikipedia.org/wiki/List_of_uniform_polyhedra&lt;br /&gt;
&lt;br /&gt;
===Our weapons===&lt;br /&gt;
&lt;br /&gt;
We can't improve the human-machine interface without knowing the strengths / weaknesses of our hardware; some of the weaknesses might turn out as exploitable features, some strengths as limiting constraints.&lt;br /&gt;
&lt;br /&gt;
====The touchscreen====&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What exactly does the touchscreen see when  you touch the screen with 2 fingers&lt;br /&gt;
  at the same time, when you move them, when you move only one of the 2, etc. I'm &lt;br /&gt;
  also interested in knowing how precise the touchscreen is (ex: refresh rate, &lt;br /&gt;
  possible pressure indication, ...)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* The output is the center of the bounding box of the touched area&lt;br /&gt;
* The touch point skips instantly on double touch&lt;br /&gt;
* Pressure has almost no effect on a single touch, but not so on a double touch. The relative pressures will cause a significant skewing effect towards the harder touch. You can easily move the pointer along the line between your two fingers by changing the relative pressure.&lt;br /&gt;
&lt;br /&gt;
Conclusions:&lt;br /&gt;
* we can detect double touch as jumps, and that's all&lt;br /&gt;
* no pressure&lt;br /&gt;
* This could be an interesting input method for games - e.g. holding the Neo in landscape view, letting each thumb rest on a specific input area; probably needs to be checked for usability with a real device&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when sliding two fingers in parallel up(L,R)-&amp;gt;down(L,R)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see a slide along the center line between your two fingers. In practice, you can't keep the pressure equal, so you will see some kind of zig-zag line somewhere between the two pressure points in the direction of your slide.&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when narrowing two fingers in slide (=zoom effect on iphone)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see the pointer stay at the center of the zoom movement. In practice, you can't keep the pressure equal for both fingers, so the pointer will move towards one of the two pressure points.&lt;br /&gt;
&lt;br /&gt;
====Graphics and computational capabilities====&lt;br /&gt;
&lt;br /&gt;
It would be good to report what performance the current hardware allows:&lt;br /&gt;
* There was no pure X11 benchmarking done (AFAIK) (how many fps at full VGA scrolling, ex: 1024*480 image scrolling?)&lt;br /&gt;
* what about the lcd reactivity? What if we don't see anything but blur while moving items fast?&lt;br /&gt;
&lt;br /&gt;
Please report here your impressions.&lt;br /&gt;
&lt;br /&gt;
==Areas of improvement==&lt;br /&gt;
&lt;br /&gt;
* OpenGL for fluid zooming interfaces (2D: the infinite sphere model, 1D: the infinite wheel of fortune/ribbon model, exposé)&lt;br /&gt;
* HandGestures&lt;br /&gt;
* Physics-model based improvements: inertia and friction&lt;br /&gt;
* multi touch screen for natural handgestures &lt;br /&gt;
* improved virtual keyboard&lt;br /&gt;
* switching to another GUI toolkit (EFLs)&lt;br /&gt;
&lt;br /&gt;
===Physics-inspired animation a.k.a. &amp;quot;Digital Physics&amp;quot;===&lt;br /&gt;
&lt;br /&gt;
If we want to add eye candy &amp;amp; usability to the UI (such as smooth realistic list scrolling, as seen in apple's&lt;br /&gt;
iphone demo on contacts lists for instance), we'll need a physics engine, so that moves &amp;amp; animations aren't all linear.&lt;br /&gt;
&lt;br /&gt;
The following aticle explains the [http://www.readwriteweb.com/archives/the_physics_of_iphone.php Digital Physics] term from the iPhone example.&lt;br /&gt;
&lt;br /&gt;
The most used technique for calculating trajectories and systems of related geometrical objects seems to be [http://en.wikipedia.org/wiki/Verlet_integration verlet integration] implementation; it is an alternative to Euler's integration method, using fast approximation. &lt;br /&gt;
&lt;br /&gt;
We may have no need for such a mathematical method at first, but perhaps there are other use cases. For instance, it may be useful to gesture recognition (i'm not aware if existing gesture recognition engines measure speed, acceleration...).&lt;br /&gt;
&lt;br /&gt;
====Open Dynamics Engine====&lt;br /&gt;
&lt;br /&gt;
ODE is an open source, high performance library for simulating rigid body dynamics. It is fully featured, stable, mature and platform independent with an easy to use C/C++ API. It has advanced joint types and integrated collision detection with friction. ODE is useful for simulating vehicles, objects in virtual reality environments and virtual creatures. It is currently used in many computer games, 3D authoring tools and simulation tools.&lt;br /&gt;
&lt;br /&gt;
http://www.ode.org/&lt;br /&gt;
&lt;br /&gt;
====Libakamaru====&lt;br /&gt;
&lt;br /&gt;
The [http://people.freedesktop.org/~krh/akamaru.git/ akamaru library] is the code behind [http://www.youtube.com/watch?v=VekgyKQoTeM kiba dock]'s fun and dynamic behaviour. It's dependencies are light (needs just GLib). It takes elasticity, friction, gravity into account.&lt;br /&gt;
&lt;br /&gt;
If you want to take a quick look at the code:&lt;br /&gt;
svn co http://svn.kiba-dock.org/akamaru/ akamaru&lt;br /&gt;
&lt;br /&gt;
The only (AFAIK) application using this library is kiba-dock, a *fun* app launcher, but we may find another use to it in the future.&lt;br /&gt;
&lt;br /&gt;
As suggested on the mailing list, it is mostly overkill for the uses we intend to have, but this library may be optimized already, the API can spare some time for too. Furthermore, ''Qui peut le plus, peut le moins''.&lt;br /&gt;
&lt;br /&gt;
====Verlet integration implementation from e17====&lt;br /&gt;
&lt;br /&gt;
There's an undergoing verlet integration implementation into the e17 project (by rephorm) see http://rephorm.com/news/tag/physics , so we may see some UI physics integration into e17 someday.&lt;br /&gt;
&lt;br /&gt;
====Robert Pernner's easy equations====&lt;br /&gt;
&lt;br /&gt;
http://www.robertpenner.com/easing/&lt;br /&gt;
&lt;br /&gt;
See the demo: implements non linear behaviour (actionscript), but may give inspiration&lt;br /&gt;
&lt;br /&gt;
===Extending the touchscreen capabilities and input methods===&lt;br /&gt;
&lt;br /&gt;
* '''Multitouchscreen emulation'''&lt;br /&gt;
&lt;br /&gt;
If we got it right, when touching the screen on a second place, the cursor oscillates between the two points depending on relative pressure distribution. Using averaging algorithms, we may have the opportunity to detect peculiar behaviours.&lt;br /&gt;
&lt;br /&gt;
We need raw data (x,y,t) from the real hardware for the following behaviours:&lt;br /&gt;
* slide two fingers in parallel - vertical up/down (scroll)&lt;br /&gt;
* turn the two fingers around (rotate)&lt;br /&gt;
* slide two fingers towards each other (zoom-)&lt;br /&gt;
* slide two fingers apart (zoom+)&lt;br /&gt;
&lt;br /&gt;
When touching the screen with two fingers at the same time, we necessarily see the two points, or are able to extrapolate the position of the second one. This solution can add feature, but will probably be little erratic...&lt;br /&gt;
&lt;br /&gt;
* '''Touchscreen kernel module hacking'''&lt;br /&gt;
&lt;br /&gt;
We may correct the &amp;quot;half distance&amp;quot; phenomenon on double touch: if double touch is detected, then assimilate the cursor as twice further than the first touch. It would allow finer control, but higher instability.&lt;br /&gt;
&lt;br /&gt;
The double touch detection may be implemented in the driver itself, as well as stabilization.&lt;br /&gt;
&lt;br /&gt;
* '''Other detectable behaviours'''&lt;br /&gt;
&lt;br /&gt;
The warping can be used in the 4 diagonals, plus the up/down/right/left cross:&lt;br /&gt;
&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
  - 1            -  - 1          2 -  - 1            -  -      2       -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -             2-  -              -  - 2            -  -      1       -&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
&lt;br /&gt;
It's not double touch, but two sequential presses with a short time in between (~0.5 s)&lt;br /&gt;
&lt;br /&gt;
===Improved virtual keyboard===&lt;br /&gt;
&lt;br /&gt;
One nice idea for virtual input is [http://www.micropp.se/openmoko/ finger-splash]&lt;br /&gt;
&lt;br /&gt;
Yet, optimization does not only apply to the plain one-letter-at-a-time input. We need some sort of T9 (dictionary-based input help). When typing a word, the first letter determines the next possible ones. Therefore, we may let disappear the less-probable following letters. Ex: type an L, there's no way an X follows...&lt;br /&gt;
&lt;br /&gt;
Hints: &lt;br /&gt;
* ZIP's huffmann compression applied to SMSs/mails for detecting the most used characters/words/sentences.&lt;br /&gt;
* html tag-clouds, one-letter tag clouds ; font size proportional to the probability of being used&lt;br /&gt;
&lt;br /&gt;
The most critical point is the initial disposition of the letters, before any letter is typed. We may also want to use horizontal two-parts keyboard (with the neo in hands like a psp..)&lt;br /&gt;
&lt;br /&gt;
The [http://www.strout.net/info/ideas/hexinput.html hexinput] concept is interesting. What about hiding the less probable letters and increasing the remaining ones during typing?&lt;br /&gt;
&lt;br /&gt;
===Towards OpenGL compositing===&lt;br /&gt;
&lt;br /&gt;
There are [http://www.hbmobile.org/wiki/index.php?title=GUI_Frameworks lots of possible GUI frameworks] with various software architectures that could be used for OpenMoko.&lt;br /&gt;
&lt;br /&gt;
GTA01 hardware uses GTK+/matchbox without hardware acceleration, and it's not enough: this is a first that a mobile Linux device has such a high DPI resolution. OpenGL ES compositing seems to have a bright future on embedded devices, because compositing seems to give natural zooming interfaces reality (at last!).&lt;br /&gt;
&lt;br /&gt;
Considering recent changes in destkop applications, opengl has a definite future. For instance, the expose (be it apple's or beryl's) is a very interesting and usable feature. Using compositing allows the physics metaphore: '''the human brain doesn't like &amp;quot;gaps&amp;quot;/jumps (for instance while scrolling a text), it needs continuity''', which can be provided by opengl. When you look at apple's iphone prototype, it's not just eye candy, it's maybe the most natural/human way of navigating, because it's sufficiently realistic for the brain to forget the non-physical nature of what's inside.&lt;br /&gt;
&lt;br /&gt;
So, opengl hardware will be needed in a more or less distant hardware, for 100% fluid operation. Benchmarking will be needed to compare the different alternatives that are cited further.&lt;br /&gt;
&lt;br /&gt;
====The Enlightenment Foundation Libraries====&lt;br /&gt;
&lt;br /&gt;
EFL's Evas is a powerful and power sparing canvas drawing library. It can be OpenGL accelerated. Python/Ruby bindings are available in the &amp;quot;proto&amp;quot; e17 cvs folder.&lt;br /&gt;
&lt;br /&gt;
''Moved [[E17|here]]''&lt;br /&gt;
&lt;br /&gt;
====Clutter Toolkit====&lt;br /&gt;
&lt;br /&gt;
Clutter, an [http://o-hand.com/ OpenedHand] project, is an open source software library for creating fast, visually rich graphical user interfaces. The most obvious example of potential usage is in media center type applications.&lt;br /&gt;
&lt;br /&gt;
http://clutter-project.org/&lt;br /&gt;
&lt;br /&gt;
Clutter uses OpenGL (and optionally '''OpenGL ES''') for rendering but with an API which hides the underlying GL complexity from the developer. The Clutter API is intended to be easy to use, efficient and flexible.&lt;br /&gt;
&lt;br /&gt;
It does integrate gstreamer (for easy media playback, even camera or mic inputs), allows pango text rendering, cairo graphics rendering. Provided bindings are python, C# and Ruby.&lt;br /&gt;
&lt;br /&gt;
GTK off screen rendering is supposed to be on it's way; once it is here, there will be a possibility of using GTK apps directly within OpenGL apps as textures, which would lead to the possibility of creating a full OpenGL &amp;quot;application manager&amp;quot; (as well as media consuming app) with ZUI features.&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C, OpenGL&lt;br /&gt;
* Bindings: Python, C#, Ruby&lt;br /&gt;
* Backends: GLX / SDL / EGL&lt;br /&gt;
* Media support: Gstreamer integration, Cairo graphics rendering, Pango fonts rendering&lt;br /&gt;
* Embedding: GTK embedding&lt;br /&gt;
&lt;br /&gt;
====Graff====&lt;br /&gt;
&lt;br /&gt;
An early demonstration of Graff, which ''is a lighweight high-performance graphics rendering library.''&lt;br /&gt;
http://www.mdk.org.pl/articles/2007/04/23/chapter-1-in-which-we-meet-graff&lt;br /&gt;
&lt;br /&gt;
Be sure to check out this demo (scrolling list with inertia scrolling)&lt;br /&gt;
http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Of course it will remind you of Apple iPhone's UI. But this one runs in software mode on Nokia N770&amp;amp;800 already. The most notable part of Graff seems to be the inertia and physics integration in general.&lt;br /&gt;
&lt;br /&gt;
====Pigment API====&lt;br /&gt;
&lt;br /&gt;
Fluendo's (the Gstreamer guys) ''[https://core.fluendo.com/pigment/trac Pigment] is a Python library designed to easily build user interfaces with embedded multimedia. Its design allows to use it on several platforms, thanks to a plugin system allowing to choose the underlying graphical API. Pigment is the rendering engine of Elisa, the Fluendo Media Center project.''&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C OpenGL&lt;br /&gt;
* Bindings: Python&lt;br /&gt;
* Backends: DirectFB OpenGL&lt;br /&gt;
* Media playback integration: using Gstreamer&lt;br /&gt;
&lt;br /&gt;
===Choosing===&lt;br /&gt;
&lt;br /&gt;
Benchmarking will be needed. We have therefore to define a std testing application that would allow to compare alternatives. &lt;br /&gt;
&lt;br /&gt;
Some Clutter VS Pigment information: http://www.taimila.com/?q=node/14&lt;br /&gt;
&lt;br /&gt;
==Improvement ideas==&lt;br /&gt;
&lt;br /&gt;
Please add here any idea that seems of relevance.&lt;br /&gt;
&lt;br /&gt;
===1D list scrolling: looped physics-driven item list===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
&lt;br /&gt;
[EDIT] Graff's inertia scrolling list example: http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
====Controls====&lt;br /&gt;
&lt;br /&gt;
* Sliding up/down = Single click + maintained for a minimal distance&lt;br /&gt;
&lt;br /&gt;
Effect: scroll in an inverted/negated fashion (slide down = scroll up, slide up = scroll down)&lt;br /&gt;
&lt;br /&gt;
When finger is released (i.e. touchscreen doesn't detect any press):&lt;br /&gt;
  if (last_speed_seen &amp;gt; 0 ) then keep this speed and acceleration, with friction&lt;br /&gt;
  else stop scrolling&lt;br /&gt;
&lt;br /&gt;
Scrolling here is seen as unidimensional, but can apply to bidimensional situations (ex: zoomed image) too&lt;br /&gt;
&lt;br /&gt;
* Action = quick double tap&lt;br /&gt;
&lt;br /&gt;
* Details/select = short single tap&lt;br /&gt;
&lt;br /&gt;
* Right click = long tap&lt;br /&gt;
&lt;br /&gt;
* Sliding left/right: switch sorting method&lt;br /&gt;
&lt;br /&gt;
====Parts to modify====&lt;br /&gt;
&lt;br /&gt;
''Having a scroll that isn't a 1:1 map to the user's action isn't hard. It's just an extra calculation in the scroll code.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;---- Where is the scroll code? :)&lt;br /&gt;
&lt;br /&gt;
* libmokoui&lt;br /&gt;
** [[Stylus_Scrolling | Stylus scrolling widget]]&lt;br /&gt;
** [[Finger_Scrolling | Finger scrolling wheel widget]]&lt;br /&gt;
* gtk&lt;br /&gt;
** [http://www.gtk.org/api/2.6/gtk/GtkVScrollbar.html GtkVScrollbar]&lt;br /&gt;
&lt;br /&gt;
The best would be to add the feature for both finger and stylus scrolling.&lt;br /&gt;
&lt;br /&gt;
TODO:&lt;br /&gt;
* make the entire list a &amp;quot;scrolling zone&amp;quot;, i.e. an overlay transparent scrolling widget?&lt;br /&gt;
* define controls&lt;br /&gt;
* add the inertia feature&lt;br /&gt;
&lt;br /&gt;
===1D Scrolling: inertia friction integration into openmoko's finger wheel=== &lt;br /&gt;
&lt;br /&gt;
The same, but for the wheel. It can be very short to do: you don't have 1:1 anymore, but, for example, 1/4 wheel turn = 1 item. It's demultiplicated, but has inertia.&lt;br /&gt;
&lt;br /&gt;
===Left-handed UI Support===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
A discussion on the community list identified a desire to have the ability to switch the OpenMoko UI into &amp;quot;left-handed&amp;quot; mode.  &lt;br /&gt;
&lt;br /&gt;
 The main problem is scrollbars, when they're on the right, dragging  &lt;br /&gt;
 the scrollbar left handed results in your hand covering the screen so  &lt;br /&gt;
 you can't see what you are doing. So having the option of scrollbars  &lt;br /&gt;
 on the left would be useful.&lt;br /&gt;
&lt;br /&gt;
 I don't think the whole screen should be mirrored! There are some elements&lt;br /&gt;
 that should remain..like the main top bar with the status icons and such.&lt;br /&gt;
 Scrollbars are the main thing I can think of right now.&lt;br /&gt;
&lt;br /&gt;
===Handgesture recognition proposals===&lt;br /&gt;
&lt;br /&gt;
====Using simple, localized warp as modifier key====&lt;br /&gt;
&lt;br /&gt;
As discussed on community list:&lt;br /&gt;
&lt;br /&gt;
  If you hold down one finger and tap the other one, the mouse pops over and back&lt;br /&gt;
  again. If you keep your second finger touching, the cursor follows it. When you&lt;br /&gt;
  release it, cursor goes back to first finger position. This could be a way to&lt;br /&gt;
  set a bounding box or turn on the mode. So the second finger can do something&lt;br /&gt;
  like rotating around the first, or increase or lower the distance to the first.&lt;br /&gt;
&lt;br /&gt;
* the so-called &amp;quot;first touch&amp;quot; can be done on the mokowheel zone itself: put your left thumb on the black area; if you touch the screen with another finger, there is a '''warp'''; the warp is detectable and allows to enter &amp;quot;fake multi-touchscreen mode&amp;quot;&lt;br /&gt;
* afterwards,&lt;br /&gt;
     * slide your right-hand finger down, it scrolls up&lt;br /&gt;
     * slide your right-hand finger up, it scrolls down&lt;br /&gt;
     * slide it left, next page/item&lt;br /&gt;
     * slide it right, previous page/item&lt;br /&gt;
     * do a circle: rotation&lt;br /&gt;
     * narrow towards the black circle: zoom -&lt;br /&gt;
     * go away: zoom +&lt;br /&gt;
* if you had kept your first finger on the black quarter circle, you can continue issuing other gestures&lt;br /&gt;
&lt;br /&gt;
The advantages of using simple origin-driven cursor warping as double touch detection criteria is that:&lt;br /&gt;
* you don't have to use the wheel as button, which would slow things down and generate errors (false button presses)&lt;br /&gt;
* simpler detection algorithms that can pass by the fluctuation due to pressure relative distribution&lt;br /&gt;
* the space taken by the wheel itself is &amp;quot;useless&amp;quot; (i.e. displays no information); using it as modifier allows to keep the screen clean for reading&lt;br /&gt;
* the origin of this zone lets use maximum surface of the screen, allowing more fine controlling&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_rotate_right.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_previous.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_down.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_zoom-.png]]&lt;br /&gt;
&lt;br /&gt;
*Pros:&lt;br /&gt;
** who said we need multi-touch hardware?&lt;br /&gt;
** this may be the easiest way (in terms of design/implementation complexity, reliability)&lt;br /&gt;
*Cons: &lt;br /&gt;
** no matter what we'll invent, we'll need two hands for on-the-move controlling&lt;br /&gt;
** what about left-handed people?&lt;br /&gt;
&lt;br /&gt;
====What is to modify ?====&lt;br /&gt;
&lt;br /&gt;
We need to emulate key presses. We need to work at a layer where we can get raw cursor coordinates. &amp;lt;---- X server layer?&lt;br /&gt;
&lt;br /&gt;
There is a fake keyboard module (for dev purposes) in the main kernel tree, which could be used to simulate keyboard presses (hence keeping keyboard-enabled apps unmodified).&lt;br /&gt;
&lt;br /&gt;
====Full multi-touch emulation====&lt;br /&gt;
&lt;br /&gt;
Doable, but tricky...&lt;br /&gt;
&lt;br /&gt;
==Preparing the multi touch==&lt;br /&gt;
&lt;br /&gt;
One day we might get multitouch devices. Let's get ready.&lt;br /&gt;
&lt;br /&gt;
===MPX===&lt;br /&gt;
 	&lt;br /&gt;
The Multi-Pointer X Server is a modification of the X server to support multiple mice and keyboards in X. It provides users with one cursor per device and one keyboard focus per keyboard. Each cursor can operate independently. MPX is the first multicursor windowing system and allows two-handed interaction with legacy applications, but also the creation of innovative applications and user interfaces. &lt;br /&gt;
&lt;br /&gt;
[http://wearables.unisa.edu.au/mpx/ The multipoint X server project]&lt;br /&gt;
&lt;br /&gt;
===MacSlow's Lowfat getting multitouched===&lt;br /&gt;
&lt;br /&gt;
http://dlai.jafu.dk/?p=1&lt;br /&gt;
&lt;br /&gt;
==Open questions==&lt;br /&gt;
&lt;br /&gt;
* will the neo/openmoko graphics system be powerful enough for such uses? I apple uses an OpenGL ES acceleration on this device (as well as on recent iPods), which is on the way with [[GTA02#.22Phase_2.22_.28GTA02.2C_.22Mass_Market.22.29|GTA02]].&lt;br /&gt;
* how does the touchscreen behave? We need a detailed touchscreen wiki information page, with visual traces. How hardware-specific is it?&lt;br /&gt;
* is multi touch really that awesome? I guess not.&lt;br /&gt;
&lt;br /&gt;
{{Languages|UI Improvements}}&lt;br /&gt;
&lt;br /&gt;
[[Category:User Interfaces| ]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/UI_Improvements</id>
		<title>UI Improvements</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/UI_Improvements"/>
				<updated>2007-07-27T17:14:15Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Towards OpenGL compositing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
  Obviously the tools are in the wild to build interfaces that could rival&lt;br /&gt;
  (or better IMO) anything Apple comes up with. We just need to organize&lt;br /&gt;
  this stuff. This would need hardware that can support dynamic&lt;br /&gt;
  interfaces. I can help here, too.&lt;br /&gt;
  sean@openmoko.com&lt;br /&gt;
&lt;br /&gt;
In fact, this place shall be dedicated to human-machine interactions improvements discussion;&lt;br /&gt;
&lt;br /&gt;
Human-machine interaction can be separated into several aspects:&lt;br /&gt;
* the physical contact/input device: the mono-touch touchscreen&lt;br /&gt;
* the graphics: &lt;br /&gt;
** accelerated rendering can add more consistency to zooming user interfaces, which seem to be quite an interesting concept for embedded scrensize-limited devices&lt;br /&gt;
** adding physics &amp;quot;look and feel&amp;quot; to (ex: menu's) behaviours can add coherence too&lt;br /&gt;
* the input methods&lt;br /&gt;
** the virtual keyboard&lt;br /&gt;
** handgestures&lt;br /&gt;
&lt;br /&gt;
==Finding inspiration ...==&lt;br /&gt;
&lt;br /&gt;
===Seen Live===&lt;br /&gt;
&lt;br /&gt;
'''Multi-touch'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=89sz8ExZndc Multi-Touchscreen experiments video @youtube]&lt;br /&gt;
*[http://www.youtube.com/watch?v=nPqqfVLQ_qY iPhone UI features demo @youtube]&lt;br /&gt;
&lt;br /&gt;
'''Zooming user interfaces'''&lt;br /&gt;
*[http://www.zenzui.com/products.html ZenZui], a [http://en.wikipedia.org/wiki/ZUI ZUI (zooming user interface)]&lt;br /&gt;
*[http://labs.live.com/Deepfish/videos.aspx Microsoft Bluefish's ZUI] (new mobile webbrowser)&lt;br /&gt;
*[http://googlesystem.blogspot.com/2007/04/opera-920-more-homepages-at-your.html Opera speed dial]&lt;br /&gt;
&lt;br /&gt;
'''Graphics'''&lt;br /&gt;
*[http://www.rasterman.com/files/eem.avi EEM], Rasterman's EFL libs on handelds proof of concept (doesn't DO anything, just showing off the EFLs on a handeld)&lt;br /&gt;
*[http://www.youtube.com/watch?v=8kLFPfaxQ6U&amp;amp;eurl= Nvidia's cutting-edge techno], an [http://www.khronos.org/openkode/ Openkode] demo.&lt;br /&gt;
&lt;br /&gt;
'''Science fiction'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=G_FS2TiK3AI UPMC Future?]&lt;br /&gt;
&lt;br /&gt;
'''Links:'''&lt;br /&gt;
*[http://elevate.sourceforge.net/links.html elevate project's links] sums up quite greatly the latest innovations in the desktop area&lt;br /&gt;
*[http://nooface.net/ Nooface] is a human-machine news site&lt;br /&gt;
*Asus-Intel's [http://www.hothardware.com/articles/Hands_on_with_the_ASUS_Eee/?page=2 Eee]'s interface&lt;br /&gt;
&lt;br /&gt;
===Clever hacks===&lt;br /&gt;
&lt;br /&gt;
It's been said that having no multitouch screen allows less freedom for innovation. Maybe we could get something out of our touchscreen drivers.&lt;br /&gt;
&lt;br /&gt;
Why ? Think of apple's scroll up/down feature on macbooks touchpads (which '''aren't multi touch''', it's a [http://iscroll2.sourceforge.net/ clever driver hack, iscroll2]):&lt;br /&gt;
&lt;br /&gt;
  To scroll, just place two fingers on your trackpad instead of one. Both fingers&lt;br /&gt;
  need to be placed next to each other horizontally (not vertically, the trackpad &lt;br /&gt;
  cannot detect that). Some people get better results with their finger spaced a&lt;br /&gt;
  little bit apart, while others prefer having the fingers right next to each other.&lt;br /&gt;
&lt;br /&gt;
  iScroll2 provides two scrolling modes: Linear and circular scrolling.&lt;br /&gt;
&lt;br /&gt;
  For linear scrolling, move the two fingers up/down or left/right in a straight &lt;br /&gt;
  line, respectively, to scroll in that direction.&lt;br /&gt;
&lt;br /&gt;
  Circular scrolling works in a way similar to the iPod's scroll wheel: Move the two&lt;br /&gt;
  fingers in a circle to scroll up or down, depending   on whether you move in a &lt;br /&gt;
  clockwise or counterclockwise direction.&lt;br /&gt;
&lt;br /&gt;
Maybe we can port/adapt/get inspiration from this macintosh driver.&lt;br /&gt;
&lt;br /&gt;
===n-D navigation: the polyhedra inspiration===&lt;br /&gt;
&lt;br /&gt;
When we want to navigate files, mp3s in an mp3 player, etc... Every control that the application needs is a button. What about looking at the polyhedrons? We could find one for each usage, with as many surrounding subzones that may be used as controls. Ex: you need 5 buttons, let's take a pentagon with 5 surrounding zones all around. That way, it's always optimized...&lt;br /&gt;
&lt;br /&gt;
http://en.wikipedia.org/wiki/Polyhedra&lt;br /&gt;
http://en.wikipedia.org/wiki/List_of_uniform_polyhedra&lt;br /&gt;
&lt;br /&gt;
===Our weapons===&lt;br /&gt;
&lt;br /&gt;
We can't improve the human-machine interface without knowing the strengths / weaknesses of our hardware; some of the weaknesses might turn out as exploitable features, some strengths as limiting constraints.&lt;br /&gt;
&lt;br /&gt;
====The touchscreen====&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What exactly does the touchscreen see when  you touch the screen with 2 fingers&lt;br /&gt;
  at the same time, when you move them, when you move only one of the 2, etc. I'm &lt;br /&gt;
  also interested in knowing how precise the touchscreen is (ex: refresh rate, &lt;br /&gt;
  possible pressure indication, ...)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* The output is the center of the bounding box of the touched area&lt;br /&gt;
* The touch point skips instantly on double touch&lt;br /&gt;
* Pressure has almost no effect on a single touch, but not so on a double touch. The relative pressures will cause a significant skewing effect towards the harder touch. You can easily move the pointer along the line between your two fingers by changing the relative pressure.&lt;br /&gt;
&lt;br /&gt;
Conclusions:&lt;br /&gt;
* we can detect double touch as jumps, and that's all&lt;br /&gt;
* no pressure&lt;br /&gt;
* This could be an interesting input method for games - e.g. holding the Neo in landscape view, letting each thumb rest on a specific input area; probably needs to be checked for usability with a real device&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when sliding two fingers in parallel up(L,R)-&amp;gt;down(L,R)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see a slide along the center line between your two fingers. In practice, you can't keep the pressure equal, so you will see some kind of zig-zag line somewhere between the two pressure points in the direction of your slide.&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when narrowing two fingers in slide (=zoom effect on iphone)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see the pointer stay at the center of the zoom movement. In practice, you can't keep the pressure equal for both fingers, so the pointer will move towards one of the two pressure points.&lt;br /&gt;
&lt;br /&gt;
====Graphics and computational capabilities====&lt;br /&gt;
&lt;br /&gt;
It would be good to report what performance the current hardware allows:&lt;br /&gt;
* There was no pure X11 benchmarking done (AFAIK) (how many fps at full VGA scrolling, ex: 1024*480 image scrolling?)&lt;br /&gt;
* what about the lcd reactivity? What if we don't see anything but blur while moving items fast?&lt;br /&gt;
&lt;br /&gt;
Please report here your impressions.&lt;br /&gt;
&lt;br /&gt;
==Areas of improvement==&lt;br /&gt;
&lt;br /&gt;
* OpenGL for fluid zooming interfaces (2D: the infinite sphere model, 1D: the infinite wheel of fortune/ribbon model, exposé)&lt;br /&gt;
* HandGestures&lt;br /&gt;
* Physics-model based improvements: inertia and friction&lt;br /&gt;
* multi touch screen for natural handgestures &lt;br /&gt;
* improved virtual keyboard&lt;br /&gt;
* switching to another GUI toolkit (EFLs)&lt;br /&gt;
&lt;br /&gt;
===Physics-inspired animation a.k.a. &amp;quot;Digital Physics&amp;quot;===&lt;br /&gt;
&lt;br /&gt;
If we want to add eye candy &amp;amp; usability to the UI (such as smooth realistic list scrolling, as seen in apple's&lt;br /&gt;
iphone demo on contacts lists for instance), we'll need a physics engine, so that moves &amp;amp; animations aren't all linear.&lt;br /&gt;
&lt;br /&gt;
The following aticle explains the [http://www.readwriteweb.com/archives/the_physics_of_iphone.php Digital Physics] term from the iPhone example.&lt;br /&gt;
&lt;br /&gt;
The most used technique for calculating trajectories and systems of related geometrical objects seems to be [http://en.wikipedia.org/wiki/Verlet_integration verlet integration] implementation; it is an alternative to Euler's integration method, using fast approximation. &lt;br /&gt;
&lt;br /&gt;
We may have no need for such a mathematical method at first, but perhaps there are other use cases. For instance, it may be useful to gesture recognition (i'm not aware if existing gesture recognition engines measure speed, acceleration...).&lt;br /&gt;
&lt;br /&gt;
====Open Dynamics Engine====&lt;br /&gt;
&lt;br /&gt;
ODE is an open source, high performance library for simulating rigid body dynamics. It is fully featured, stable, mature and platform independent with an easy to use C/C++ API. It has advanced joint types and integrated collision detection with friction. ODE is useful for simulating vehicles, objects in virtual reality environments and virtual creatures. It is currently used in many computer games, 3D authoring tools and simulation tools.&lt;br /&gt;
&lt;br /&gt;
http://www.ode.org/&lt;br /&gt;
&lt;br /&gt;
====Libakamaru====&lt;br /&gt;
&lt;br /&gt;
The [http://people.freedesktop.org/~krh/akamaru.git/ akamaru library] is the code behind [http://www.youtube.com/watch?v=VekgyKQoTeM kiba dock]'s fun and dynamic behaviour. It's dependencies are light (needs just GLib). It takes elasticity, friction, gravity into account.&lt;br /&gt;
&lt;br /&gt;
If you want to take a quick look at the code:&lt;br /&gt;
svn co http://svn.kiba-dock.org/akamaru/ akamaru&lt;br /&gt;
&lt;br /&gt;
The only (AFAIK) application using this library is kiba-dock, a *fun* app launcher, but we may find another use to it in the future.&lt;br /&gt;
&lt;br /&gt;
As suggested on the mailing list, it is mostly overkill for the uses we intend to have, but this library may be optimized already, the API can spare some time for too. Furthermore, ''Qui peut le plus, peut le moins''.&lt;br /&gt;
&lt;br /&gt;
====Verlet integration implementation from e17====&lt;br /&gt;
&lt;br /&gt;
There's an undergoing verlet integration implementation into the e17 project (by rephorm) see http://rephorm.com/news/tag/physics , so we may see some UI physics integration into e17 someday.&lt;br /&gt;
&lt;br /&gt;
====Robert Pernner's easy equations====&lt;br /&gt;
&lt;br /&gt;
http://www.robertpenner.com/easing/&lt;br /&gt;
&lt;br /&gt;
See the demo: implements non linear behaviour (actionscript), but may give inspiration&lt;br /&gt;
&lt;br /&gt;
===Extending the touchscreen capabilities and input methods===&lt;br /&gt;
&lt;br /&gt;
* '''Multitouchscreen emulation'''&lt;br /&gt;
&lt;br /&gt;
If we got it right, when touching the screen on a second place, the cursor oscillates between the two points depending on relative pressure distribution. Using averaging algorithms, we may have the opportunity to detect peculiar behaviours.&lt;br /&gt;
&lt;br /&gt;
We need raw data (x,y,t) from the real hardware for the following behaviours:&lt;br /&gt;
* slide two fingers in parallel - vertical up/down (scroll)&lt;br /&gt;
* turn the two fingers around (rotate)&lt;br /&gt;
* slide two fingers towards each other (zoom-)&lt;br /&gt;
* slide two fingers apart (zoom+)&lt;br /&gt;
&lt;br /&gt;
When touching the screen with two fingers at the same time, we necessarily see the two points, or are able to extrapolate the position of the second one. This solution can add feature, but will probably be little erratic...&lt;br /&gt;
&lt;br /&gt;
* '''Touchscreen kernel module hacking'''&lt;br /&gt;
&lt;br /&gt;
We may correct the &amp;quot;half distance&amp;quot; phenomenon on double touch: if double touch is detected, then assimilate the cursor as twice further than the first touch. It would allow finer control, but higher instability.&lt;br /&gt;
&lt;br /&gt;
The double touch detection may be implemented in the driver itself, as well as stabilization.&lt;br /&gt;
&lt;br /&gt;
* '''Other detectable behaviours'''&lt;br /&gt;
&lt;br /&gt;
The warping can be used in the 4 diagonals, plus the up/down/right/left cross:&lt;br /&gt;
&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
  - 1            -  - 1          2 -  - 1            -  -      2       -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -             2-  -              -  - 2            -  -      1       -&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
&lt;br /&gt;
It's not double touch, but two sequential presses with a short time in between (~0.5 s)&lt;br /&gt;
&lt;br /&gt;
===Improved virtual keyboard===&lt;br /&gt;
&lt;br /&gt;
One nice idea for virtual input is [http://www.micropp.se/openmoko/ finger-splash]&lt;br /&gt;
&lt;br /&gt;
Yet, optimization does not only apply to the plain one-letter-at-a-time input. We need some sort of T9 (dictionary-based input help). When typing a word, the first letter determines the next possible ones. Therefore, we may let disappear the less-probable following letters. Ex: type an L, there's no way an X follows...&lt;br /&gt;
&lt;br /&gt;
Hints: &lt;br /&gt;
* ZIP's huffmann compression applied to SMSs/mails for detecting the most used characters/words/sentences.&lt;br /&gt;
* html tag-clouds, one-letter tag clouds ; font size proportional to the probability of being used&lt;br /&gt;
&lt;br /&gt;
The most critical point is the initial disposition of the letters, before any letter is typed. We may also want to use horizontal two-parts keyboard (with the neo in hands like a psp..)&lt;br /&gt;
&lt;br /&gt;
The [http://www.strout.net/info/ideas/hexinput.html hexinput] concept is interesting. What about hiding the less probable letters and increasing the remaining ones during typing?&lt;br /&gt;
&lt;br /&gt;
===Towards OpenGL compositing===&lt;br /&gt;
&lt;br /&gt;
There are [http://www.hbmobile.org/wiki/index.php?title=GUI_Frameworks lots of possible GUI frameworks] with various software architectures that could be used for OpenMoko.&lt;br /&gt;
&lt;br /&gt;
GTA01 hardware uses GTK+/matchbox without hardware acceleration, and it's not enough: this is a first that a mobile Linux device has such a high DPI resolution. OpenGL ES compositing seems to have a bright future on embedded devices, because compositing seems to give natural zooming interfaces reality (at last!).&lt;br /&gt;
&lt;br /&gt;
Considering recent changes in destkop applications, opengl has a definite future. For instance, the expose (be it apple's or beryl's) is a very interesting and usable feature. Using compositing allows the physics metaphore: '''the human brain doesn't like &amp;quot;gaps&amp;quot;/jumps (for instance while scrolling a text), it needs continuity''', which can be provided by opengl. When you look at apple's iphone prototype, it's not just eye candy, it's maybe the most natural/human way of navigating, because it's sufficiently realistic for the brain to forget the non-physical nature of what's inside.&lt;br /&gt;
&lt;br /&gt;
So, opengl hardware will be needed in a more or less distant hardware, for 100% fluid operation. Benchmarking will be needed to compare the different alternatives that are cited further.&lt;br /&gt;
&lt;br /&gt;
====The Enlightenment Foundation Libraries====&lt;br /&gt;
&lt;br /&gt;
EFL's Evas is a powerful and power sparing canvas drawing library. It can be OpenGL accelerated. Python/Ruby bindings are available in the &amp;quot;proto&amp;quot; e17 cvs folder.&lt;br /&gt;
&lt;br /&gt;
''Moved [[E17|here]]''&lt;br /&gt;
&lt;br /&gt;
====Clutter Toolkit====&lt;br /&gt;
&lt;br /&gt;
Clutter, an [http://o-hand.com/ OpenedHand] project, is an open source software library for creating fast, visually rich graphical user interfaces. The most obvious example of potential usage is in media center type applications.&lt;br /&gt;
&lt;br /&gt;
http://clutter-project.org/&lt;br /&gt;
&lt;br /&gt;
Clutter uses OpenGL (and optionally '''OpenGL ES''') for rendering but with an API which hides the underlying GL complexity from the developer. The Clutter API is intended to be easy to use, efficient and flexible.&lt;br /&gt;
&lt;br /&gt;
It does integrate gstreamer (for easy media playback, even camera or mic inputs), allows pango text rendering, cairo graphics rendering. Provided bindings are python, C# and Ruby.&lt;br /&gt;
&lt;br /&gt;
GTK off screen rendering is supposed to be on it's way; once it is here, there will be a possibility of using GTK apps directly within OpenGL apps as textures, which would lead to the possibility of creating a full OpenGL &amp;quot;application manager&amp;quot; (as well as media consuming app) with ZUI features.&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C, OpenGL&lt;br /&gt;
* Bindings: Python, C#, Ruby&lt;br /&gt;
* Backends: GLX / SDL / EGL&lt;br /&gt;
* Media support: Gstreamer integration, Cairo graphics rendering, Pango fonts rendering&lt;br /&gt;
* Embedding: GTK embedding&lt;br /&gt;
&lt;br /&gt;
====Graff====&lt;br /&gt;
&lt;br /&gt;
An early demonstration of Graff, which ''is a lighweight high-performance graphics rendering library.''&lt;br /&gt;
http://www.mdk.org.pl/articles/2007/04/23/chapter-1-in-which-we-meet-graff&lt;br /&gt;
&lt;br /&gt;
Be sure to check out this demo (scrolling list with inertia scrolling)&lt;br /&gt;
http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Of course it will remind you of Apple iPhone's UI. But this one runs in software mode on Nokia N770&amp;amp;800 already. The most notable part of Graff seems to be the inertia and physics integration in general.&lt;br /&gt;
&lt;br /&gt;
====Pigment API====&lt;br /&gt;
&lt;br /&gt;
Fluendo's (the Gstreamer guys) ''[https://core.fluendo.com/pigment/trac Pigment] is a Python library designed to easily build user interfaces with embedded multimedia. Its design allows to use it on several platforms, thanks to a plugin system allowing to choose the underlying graphical API. Pigment is the rendering engine of Elisa, the Fluendo Media Center project.''&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C OpenGL&lt;br /&gt;
* Bindings: Python&lt;br /&gt;
* Backends: DirectFB OpenGL&lt;br /&gt;
* Media playback integration: using Gstreamer&lt;br /&gt;
&lt;br /&gt;
===Choosing===&lt;br /&gt;
&lt;br /&gt;
Benchmarking will be needed. We have therefore to define a std testing application that would allow to compare alternatives. &lt;br /&gt;
&lt;br /&gt;
Some Clutter VS Pigment information: http://www.taimila.com/?q=node/14&lt;br /&gt;
&lt;br /&gt;
==Improvement ideas==&lt;br /&gt;
&lt;br /&gt;
Please add here any idea that seems of relevance.&lt;br /&gt;
&lt;br /&gt;
===1D list scrolling: looped physics-driven item list===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
&lt;br /&gt;
[EDIT] Graff's inertia scrolling list example: http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
====Controls====&lt;br /&gt;
&lt;br /&gt;
* Sliding up/down = Single click + maintained for a minimal distance&lt;br /&gt;
&lt;br /&gt;
Effect: scroll in an inverted/negated fashion (slide down = scroll up, slide up = scroll down)&lt;br /&gt;
&lt;br /&gt;
When finger is released (i.e. touchscreen doesn't detect any press):&lt;br /&gt;
  if (last_speed_seen &amp;gt; 0 ) then keep this speed and acceleration, with friction&lt;br /&gt;
  else stop scrolling&lt;br /&gt;
&lt;br /&gt;
Scrolling here is seen as unidimensional, but can apply to bidimensional situations (ex: zoomed image) too&lt;br /&gt;
&lt;br /&gt;
* Action = quick double tap&lt;br /&gt;
&lt;br /&gt;
* Details/select = short single tap&lt;br /&gt;
&lt;br /&gt;
* Right click = long tap&lt;br /&gt;
&lt;br /&gt;
* Sliding left/right: switch sorting method&lt;br /&gt;
&lt;br /&gt;
====Parts to modify====&lt;br /&gt;
&lt;br /&gt;
''Having a scroll that isn't a 1:1 map to the user's action isn't hard. It's just an extra calculation in the scroll code.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;---- Where is the scroll code? :)&lt;br /&gt;
&lt;br /&gt;
* libmokoui&lt;br /&gt;
** [[Stylus_Scrolling | Stylus scrolling widget]]&lt;br /&gt;
** [[Finger_Scrolling | Finger scrolling wheel widget]]&lt;br /&gt;
* gtk&lt;br /&gt;
** [http://www.gtk.org/api/2.6/gtk/GtkVScrollbar.html GtkVScrollbar]&lt;br /&gt;
&lt;br /&gt;
The best would be to add the feature for both finger and stylus scrolling.&lt;br /&gt;
&lt;br /&gt;
TODO:&lt;br /&gt;
* make the entire list a &amp;quot;scrolling zone&amp;quot;, i.e. an overlay transparent scrolling widget?&lt;br /&gt;
* define controls&lt;br /&gt;
* add the inertia feature&lt;br /&gt;
&lt;br /&gt;
===1D Scrolling: inertia friction integration into openmoko's finger wheel=== &lt;br /&gt;
&lt;br /&gt;
The same, but for the wheel. It can be very short to do: you don't have 1:1 anymore, but, for example, 1/4 wheel turn = 1 item. It's demultiplicated, but has inertia.&lt;br /&gt;
&lt;br /&gt;
===Left-handed UI Support===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
A discussion on the community list identified a desire to have the ability to switch the OpenMoko UI into &amp;quot;left-handed&amp;quot; mode.  &lt;br /&gt;
&lt;br /&gt;
 The main problem is scrollbars, when they're on the right, dragging  &lt;br /&gt;
 the scrollbar left handed results in your hand covering the screen so  &lt;br /&gt;
 you can't see what you are doing. So having the option of scrollbars  &lt;br /&gt;
 on the left would be useful.&lt;br /&gt;
&lt;br /&gt;
 I don't think the whole screen should be mirrored! There are some elements&lt;br /&gt;
 that should remain..like the main top bar with the status icons and such.&lt;br /&gt;
 Scrollbars are the main thing I can think of right now.&lt;br /&gt;
&lt;br /&gt;
===Handgesture recognition proposals===&lt;br /&gt;
&lt;br /&gt;
====Using simple, localized warp as modifier key====&lt;br /&gt;
&lt;br /&gt;
As discussed on community list:&lt;br /&gt;
&lt;br /&gt;
  If you hold down one finger and tap the other one, the mouse pops over and back&lt;br /&gt;
  again. If you keep your second finger touching, the cursor follows it. When you&lt;br /&gt;
  release it, cursor goes back to first finger position. This could be a way to&lt;br /&gt;
  set a bounding box or turn on the mode. So the second finger can do something&lt;br /&gt;
  like rotating around the first, or increase or lower the distance to the first.&lt;br /&gt;
&lt;br /&gt;
* the so-called &amp;quot;first touch&amp;quot; can be done on the mokowheel zone itself: put your left thumb on the black area; if you touch the screen with another finger, there is a '''warp'''; the warp is detectable and allows to enter &amp;quot;fake multi-touchscreen mode&amp;quot;&lt;br /&gt;
* afterwards,&lt;br /&gt;
     * slide your right-hand finger down, it scrolls up&lt;br /&gt;
     * slide your right-hand finger up, it scrolls down&lt;br /&gt;
     * slide it left, next page/item&lt;br /&gt;
     * slide it right, previous page/item&lt;br /&gt;
     * do a circle: rotation&lt;br /&gt;
     * narrow towards the black circle: zoom -&lt;br /&gt;
     * go away: zoom +&lt;br /&gt;
* if you had kept your first finger on the black quarter circle, you can continue issuing other gestures&lt;br /&gt;
&lt;br /&gt;
The advantages of using simple origin-driven cursor warping as double touch detection criteria is that:&lt;br /&gt;
* you don't have to use the wheel as button, which would slow things down and generate errors (false button presses)&lt;br /&gt;
* simpler detection algorithms that can pass by the fluctuation due to pressure relative distribution&lt;br /&gt;
* the space taken by the wheel itself is &amp;quot;useless&amp;quot; (i.e. displays no information); using it as modifier allows to keep the screen clean for reading&lt;br /&gt;
* the origin of this zone lets use maximum surface of the screen, allowing more fine controlling&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_rotate_right.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_previous.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_down.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_zoom-.png]]&lt;br /&gt;
&lt;br /&gt;
*Pros:&lt;br /&gt;
** who said we need multi-touch hardware?&lt;br /&gt;
** this may be the easiest way (in terms of design/implementation complexity, reliability)&lt;br /&gt;
*Cons: &lt;br /&gt;
** no matter what we'll invent, we'll need two hands for on-the-move controlling&lt;br /&gt;
** what about left-handed people?&lt;br /&gt;
&lt;br /&gt;
====What is to modify ?====&lt;br /&gt;
&lt;br /&gt;
We need to emulate key presses. We need to work at a layer where we can get raw cursor coordinates. &amp;lt;---- X server layer?&lt;br /&gt;
&lt;br /&gt;
There is a fake keyboard module (for dev purposes) in the main kernel tree, which could be used to simulate keyboard presses (hence keeping keyboard-enabled apps unmodified).&lt;br /&gt;
&lt;br /&gt;
====Full multi-touch emulation====&lt;br /&gt;
&lt;br /&gt;
Doable, but tricky...&lt;br /&gt;
&lt;br /&gt;
==Preparing the multi touch==&lt;br /&gt;
&lt;br /&gt;
One day we might get multitouch devices. Let's get ready.&lt;br /&gt;
&lt;br /&gt;
===MPX===&lt;br /&gt;
 	&lt;br /&gt;
The Multi-Pointer X Server is a modification of the X server to support multiple mice and keyboards in X. It provides users with one cursor per device and one keyboard focus per keyboard. Each cursor can operate independently. MPX is the first multicursor windowing system and allows two-handed interaction with legacy applications, but also the creation of innovative applications and user interfaces. &lt;br /&gt;
&lt;br /&gt;
[http://wearables.unisa.edu.au/mpx/ The multipoint X server project]&lt;br /&gt;
&lt;br /&gt;
===MacSlow's Lowfat getting multitouched===&lt;br /&gt;
&lt;br /&gt;
http://dlai.jafu.dk/?p=1&lt;br /&gt;
&lt;br /&gt;
==Open questions==&lt;br /&gt;
&lt;br /&gt;
* will the neo/openmoko graphics system be powerful enough for such uses? I apple uses an OpenGL ES acceleration on this device (as well as on recent iPods), which is on the way with [[GTA02#.22Phase_2.22_.28GTA02.2C_.22Mass_Market.22.29|GTA02]].&lt;br /&gt;
* how does the touchscreen behave? We need a detailed touchscreen wiki information page, with visual traces. How hardware-specific is it?&lt;br /&gt;
* is multi touch really that awesome? I guess not.&lt;br /&gt;
&lt;br /&gt;
{{Languages|UI Improvements}}&lt;br /&gt;
&lt;br /&gt;
[[Category:User Interfaces| ]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/UI_Improvements</id>
		<title>UI Improvements</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/UI_Improvements"/>
				<updated>2007-07-27T17:11:45Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
  Obviously the tools are in the wild to build interfaces that could rival&lt;br /&gt;
  (or better IMO) anything Apple comes up with. We just need to organize&lt;br /&gt;
  this stuff. This would need hardware that can support dynamic&lt;br /&gt;
  interfaces. I can help here, too.&lt;br /&gt;
  sean@openmoko.com&lt;br /&gt;
&lt;br /&gt;
In fact, this place shall be dedicated to human-machine interactions improvements discussion;&lt;br /&gt;
&lt;br /&gt;
Human-machine interaction can be separated into several aspects:&lt;br /&gt;
* the physical contact/input device: the mono-touch touchscreen&lt;br /&gt;
* the graphics: &lt;br /&gt;
** accelerated rendering can add more consistency to zooming user interfaces, which seem to be quite an interesting concept for embedded scrensize-limited devices&lt;br /&gt;
** adding physics &amp;quot;look and feel&amp;quot; to (ex: menu's) behaviours can add coherence too&lt;br /&gt;
* the input methods&lt;br /&gt;
** the virtual keyboard&lt;br /&gt;
** handgestures&lt;br /&gt;
&lt;br /&gt;
==Finding inspiration ...==&lt;br /&gt;
&lt;br /&gt;
===Seen Live===&lt;br /&gt;
&lt;br /&gt;
'''Multi-touch'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=89sz8ExZndc Multi-Touchscreen experiments video @youtube]&lt;br /&gt;
*[http://www.youtube.com/watch?v=nPqqfVLQ_qY iPhone UI features demo @youtube]&lt;br /&gt;
&lt;br /&gt;
'''Zooming user interfaces'''&lt;br /&gt;
*[http://www.zenzui.com/products.html ZenZui], a [http://en.wikipedia.org/wiki/ZUI ZUI (zooming user interface)]&lt;br /&gt;
*[http://labs.live.com/Deepfish/videos.aspx Microsoft Bluefish's ZUI] (new mobile webbrowser)&lt;br /&gt;
*[http://googlesystem.blogspot.com/2007/04/opera-920-more-homepages-at-your.html Opera speed dial]&lt;br /&gt;
&lt;br /&gt;
'''Graphics'''&lt;br /&gt;
*[http://www.rasterman.com/files/eem.avi EEM], Rasterman's EFL libs on handelds proof of concept (doesn't DO anything, just showing off the EFLs on a handeld)&lt;br /&gt;
*[http://www.youtube.com/watch?v=8kLFPfaxQ6U&amp;amp;eurl= Nvidia's cutting-edge techno], an [http://www.khronos.org/openkode/ Openkode] demo.&lt;br /&gt;
&lt;br /&gt;
'''Science fiction'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=G_FS2TiK3AI UPMC Future?]&lt;br /&gt;
&lt;br /&gt;
'''Links:'''&lt;br /&gt;
*[http://elevate.sourceforge.net/links.html elevate project's links] sums up quite greatly the latest innovations in the desktop area&lt;br /&gt;
*[http://nooface.net/ Nooface] is a human-machine news site&lt;br /&gt;
*Asus-Intel's [http://www.hothardware.com/articles/Hands_on_with_the_ASUS_Eee/?page=2 Eee]'s interface&lt;br /&gt;
&lt;br /&gt;
===Clever hacks===&lt;br /&gt;
&lt;br /&gt;
It's been said that having no multitouch screen allows less freedom for innovation. Maybe we could get something out of our touchscreen drivers.&lt;br /&gt;
&lt;br /&gt;
Why ? Think of apple's scroll up/down feature on macbooks touchpads (which '''aren't multi touch''', it's a [http://iscroll2.sourceforge.net/ clever driver hack, iscroll2]):&lt;br /&gt;
&lt;br /&gt;
  To scroll, just place two fingers on your trackpad instead of one. Both fingers&lt;br /&gt;
  need to be placed next to each other horizontally (not vertically, the trackpad &lt;br /&gt;
  cannot detect that). Some people get better results with their finger spaced a&lt;br /&gt;
  little bit apart, while others prefer having the fingers right next to each other.&lt;br /&gt;
&lt;br /&gt;
  iScroll2 provides two scrolling modes: Linear and circular scrolling.&lt;br /&gt;
&lt;br /&gt;
  For linear scrolling, move the two fingers up/down or left/right in a straight &lt;br /&gt;
  line, respectively, to scroll in that direction.&lt;br /&gt;
&lt;br /&gt;
  Circular scrolling works in a way similar to the iPod's scroll wheel: Move the two&lt;br /&gt;
  fingers in a circle to scroll up or down, depending   on whether you move in a &lt;br /&gt;
  clockwise or counterclockwise direction.&lt;br /&gt;
&lt;br /&gt;
Maybe we can port/adapt/get inspiration from this macintosh driver.&lt;br /&gt;
&lt;br /&gt;
===n-D navigation: the polyhedra inspiration===&lt;br /&gt;
&lt;br /&gt;
When we want to navigate files, mp3s in an mp3 player, etc... Every control that the application needs is a button. What about looking at the polyhedrons? We could find one for each usage, with as many surrounding subzones that may be used as controls. Ex: you need 5 buttons, let's take a pentagon with 5 surrounding zones all around. That way, it's always optimized...&lt;br /&gt;
&lt;br /&gt;
http://en.wikipedia.org/wiki/Polyhedra&lt;br /&gt;
http://en.wikipedia.org/wiki/List_of_uniform_polyhedra&lt;br /&gt;
&lt;br /&gt;
===Our weapons===&lt;br /&gt;
&lt;br /&gt;
We can't improve the human-machine interface without knowing the strengths / weaknesses of our hardware; some of the weaknesses might turn out as exploitable features, some strengths as limiting constraints.&lt;br /&gt;
&lt;br /&gt;
====The touchscreen====&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What exactly does the touchscreen see when  you touch the screen with 2 fingers&lt;br /&gt;
  at the same time, when you move them, when you move only one of the 2, etc. I'm &lt;br /&gt;
  also interested in knowing how precise the touchscreen is (ex: refresh rate, &lt;br /&gt;
  possible pressure indication, ...)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* The output is the center of the bounding box of the touched area&lt;br /&gt;
* The touch point skips instantly on double touch&lt;br /&gt;
* Pressure has almost no effect on a single touch, but not so on a double touch. The relative pressures will cause a significant skewing effect towards the harder touch. You can easily move the pointer along the line between your two fingers by changing the relative pressure.&lt;br /&gt;
&lt;br /&gt;
Conclusions:&lt;br /&gt;
* we can detect double touch as jumps, and that's all&lt;br /&gt;
* no pressure&lt;br /&gt;
* This could be an interesting input method for games - e.g. holding the Neo in landscape view, letting each thumb rest on a specific input area; probably needs to be checked for usability with a real device&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when sliding two fingers in parallel up(L,R)-&amp;gt;down(L,R)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see a slide along the center line between your two fingers. In practice, you can't keep the pressure equal, so you will see some kind of zig-zag line somewhere between the two pressure points in the direction of your slide.&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when narrowing two fingers in slide (=zoom effect on iphone)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see the pointer stay at the center of the zoom movement. In practice, you can't keep the pressure equal for both fingers, so the pointer will move towards one of the two pressure points.&lt;br /&gt;
&lt;br /&gt;
====Graphics and computational capabilities====&lt;br /&gt;
&lt;br /&gt;
It would be good to report what performance the current hardware allows:&lt;br /&gt;
* There was no pure X11 benchmarking done (AFAIK) (how many fps at full VGA scrolling, ex: 1024*480 image scrolling?)&lt;br /&gt;
* what about the lcd reactivity? What if we don't see anything but blur while moving items fast?&lt;br /&gt;
&lt;br /&gt;
Please report here your impressions.&lt;br /&gt;
&lt;br /&gt;
==Areas of improvement==&lt;br /&gt;
&lt;br /&gt;
* OpenGL for fluid zooming interfaces (2D: the infinite sphere model, 1D: the infinite wheel of fortune/ribbon model, exposé)&lt;br /&gt;
* HandGestures&lt;br /&gt;
* Physics-model based improvements: inertia and friction&lt;br /&gt;
* multi touch screen for natural handgestures &lt;br /&gt;
* improved virtual keyboard&lt;br /&gt;
* switching to another GUI toolkit (EFLs)&lt;br /&gt;
&lt;br /&gt;
===Physics-inspired animation a.k.a. &amp;quot;Digital Physics&amp;quot;===&lt;br /&gt;
&lt;br /&gt;
If we want to add eye candy &amp;amp; usability to the UI (such as smooth realistic list scrolling, as seen in apple's&lt;br /&gt;
iphone demo on contacts lists for instance), we'll need a physics engine, so that moves &amp;amp; animations aren't all linear.&lt;br /&gt;
&lt;br /&gt;
The following aticle explains the [http://www.readwriteweb.com/archives/the_physics_of_iphone.php Digital Physics] term from the iPhone example.&lt;br /&gt;
&lt;br /&gt;
The most used technique for calculating trajectories and systems of related geometrical objects seems to be [http://en.wikipedia.org/wiki/Verlet_integration verlet integration] implementation; it is an alternative to Euler's integration method, using fast approximation. &lt;br /&gt;
&lt;br /&gt;
We may have no need for such a mathematical method at first, but perhaps there are other use cases. For instance, it may be useful to gesture recognition (i'm not aware if existing gesture recognition engines measure speed, acceleration...).&lt;br /&gt;
&lt;br /&gt;
====Open Dynamics Engine====&lt;br /&gt;
&lt;br /&gt;
ODE is an open source, high performance library for simulating rigid body dynamics. It is fully featured, stable, mature and platform independent with an easy to use C/C++ API. It has advanced joint types and integrated collision detection with friction. ODE is useful for simulating vehicles, objects in virtual reality environments and virtual creatures. It is currently used in many computer games, 3D authoring tools and simulation tools.&lt;br /&gt;
&lt;br /&gt;
http://www.ode.org/&lt;br /&gt;
&lt;br /&gt;
====Libakamaru====&lt;br /&gt;
&lt;br /&gt;
The [http://people.freedesktop.org/~krh/akamaru.git/ akamaru library] is the code behind [http://www.youtube.com/watch?v=VekgyKQoTeM kiba dock]'s fun and dynamic behaviour. It's dependencies are light (needs just GLib). It takes elasticity, friction, gravity into account.&lt;br /&gt;
&lt;br /&gt;
If you want to take a quick look at the code:&lt;br /&gt;
svn co http://svn.kiba-dock.org/akamaru/ akamaru&lt;br /&gt;
&lt;br /&gt;
The only (AFAIK) application using this library is kiba-dock, a *fun* app launcher, but we may find another use to it in the future.&lt;br /&gt;
&lt;br /&gt;
As suggested on the mailing list, it is mostly overkill for the uses we intend to have, but this library may be optimized already, the API can spare some time for too. Furthermore, ''Qui peut le plus, peut le moins''.&lt;br /&gt;
&lt;br /&gt;
====Verlet integration implementation from e17====&lt;br /&gt;
&lt;br /&gt;
There's an undergoing verlet integration implementation into the e17 project (by rephorm) see http://rephorm.com/news/tag/physics , so we may see some UI physics integration into e17 someday.&lt;br /&gt;
&lt;br /&gt;
====Robert Pernner's easy equations====&lt;br /&gt;
&lt;br /&gt;
http://www.robertpenner.com/easing/&lt;br /&gt;
&lt;br /&gt;
See the demo: implements non linear behaviour (actionscript), but may give inspiration&lt;br /&gt;
&lt;br /&gt;
===Extending the touchscreen capabilities and input methods===&lt;br /&gt;
&lt;br /&gt;
* '''Multitouchscreen emulation'''&lt;br /&gt;
&lt;br /&gt;
If we got it right, when touching the screen on a second place, the cursor oscillates between the two points depending on relative pressure distribution. Using averaging algorithms, we may have the opportunity to detect peculiar behaviours.&lt;br /&gt;
&lt;br /&gt;
We need raw data (x,y,t) from the real hardware for the following behaviours:&lt;br /&gt;
* slide two fingers in parallel - vertical up/down (scroll)&lt;br /&gt;
* turn the two fingers around (rotate)&lt;br /&gt;
* slide two fingers towards each other (zoom-)&lt;br /&gt;
* slide two fingers apart (zoom+)&lt;br /&gt;
&lt;br /&gt;
When touching the screen with two fingers at the same time, we necessarily see the two points, or are able to extrapolate the position of the second one. This solution can add feature, but will probably be little erratic...&lt;br /&gt;
&lt;br /&gt;
* '''Touchscreen kernel module hacking'''&lt;br /&gt;
&lt;br /&gt;
We may correct the &amp;quot;half distance&amp;quot; phenomenon on double touch: if double touch is detected, then assimilate the cursor as twice further than the first touch. It would allow finer control, but higher instability.&lt;br /&gt;
&lt;br /&gt;
The double touch detection may be implemented in the driver itself, as well as stabilization.&lt;br /&gt;
&lt;br /&gt;
* '''Other detectable behaviours'''&lt;br /&gt;
&lt;br /&gt;
The warping can be used in the 4 diagonals, plus the up/down/right/left cross:&lt;br /&gt;
&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
  - 1            -  - 1          2 -  - 1            -  -      2       -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -             2-  -              -  - 2            -  -      1       -&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
&lt;br /&gt;
It's not double touch, but two sequential presses with a short time in between (~0.5 s)&lt;br /&gt;
&lt;br /&gt;
===Improved virtual keyboard===&lt;br /&gt;
&lt;br /&gt;
One nice idea for virtual input is [http://www.micropp.se/openmoko/ finger-splash]&lt;br /&gt;
&lt;br /&gt;
Yet, optimization does not only apply to the plain one-letter-at-a-time input. We need some sort of T9 (dictionary-based input help). When typing a word, the first letter determines the next possible ones. Therefore, we may let disappear the less-probable following letters. Ex: type an L, there's no way an X follows...&lt;br /&gt;
&lt;br /&gt;
Hints: &lt;br /&gt;
* ZIP's huffmann compression applied to SMSs/mails for detecting the most used characters/words/sentences.&lt;br /&gt;
* html tag-clouds, one-letter tag clouds ; font size proportional to the probability of being used&lt;br /&gt;
&lt;br /&gt;
The most critical point is the initial disposition of the letters, before any letter is typed. We may also want to use horizontal two-parts keyboard (with the neo in hands like a psp..)&lt;br /&gt;
&lt;br /&gt;
The [http://www.strout.net/info/ideas/hexinput.html hexinput] concept is interesting. What about hiding the less probable letters and increasing the remaining ones during typing?&lt;br /&gt;
&lt;br /&gt;
===Towards OpenGL compositing===&lt;br /&gt;
&lt;br /&gt;
There are [http://www.hbmobile.org/wiki/index.php?title=GUI_Frameworks lots of possible GUI frameworks] with various software architectures that could be used for OpenMoko.&lt;br /&gt;
&lt;br /&gt;
GTA01 hardware uses GTK+/matchbox without hardware acceleration, and it's not enough: this is a first that a mobile Linux device has such a high DPI resolution. OpenGL ES compositing seems to have a bright future on embedded devices, because compositing seems to give natural zooming interfaces reality (at last!).&lt;br /&gt;
&lt;br /&gt;
Considering recent changes in destkop applications, opengl has a definite future. For instance, the expose (be it apple's or beryl's) is a very interesting and usable feature. Using compositing allows the physics metaphore: '''the human brain doesn't like &amp;quot;gaps&amp;quot;/jumps (for instance while scrolling a text), it needs continuity''', which can be provided by opengl. When you look at apple's iphone prototype, it's not just eye candy, it's maybe the most natural/human way of navigating, because it's sufficiently realistic for the brain to forget the non-physical nature of what's inside.&lt;br /&gt;
&lt;br /&gt;
So, opengl hardware will be needed in a more or less distant hardware, for 100% fluid operation. Benchmarking will be needed to compare the different alternatives that are cited further.&lt;br /&gt;
&lt;br /&gt;
====Switching to the Enlightenment Foundation Libraries====&lt;br /&gt;
&lt;br /&gt;
Evas is a powerful and power sparing canvas drawing library. It can be OpenGL accelerated. Python/Ruby bindings are available in the &amp;quot;proto&amp;quot; e17 cvs folder.&lt;br /&gt;
&lt;br /&gt;
''Moved [[E17|here]]''&lt;br /&gt;
&lt;br /&gt;
====Clutter Toolkit====&lt;br /&gt;
&lt;br /&gt;
Clutter, an [http://o-hand.com/ OpenedHand] project, is an open source software library for creating fast, visually rich graphical user interfaces. The most obvious example of potential usage is in media center type applications.&lt;br /&gt;
&lt;br /&gt;
http://clutter-project.org/&lt;br /&gt;
&lt;br /&gt;
Clutter uses OpenGL (and optionally '''OpenGL ES''') for rendering but with an API which hides the underlying GL complexity from the developer. The Clutter API is intended to be easy to use, efficient and flexible.&lt;br /&gt;
&lt;br /&gt;
It does integrate gstreamer (for easy media playback, even camera or mic inputs), allows pango text rendering, cairo graphics rendering. Provided bindings are python, C# and Ruby.&lt;br /&gt;
&lt;br /&gt;
GTK off screen rendering is supposed to be on it's way; once it is here, there will be a possibility of using GTK apps directly within OpenGL apps as textures, which would lead to the possibility of creating a full OpenGL &amp;quot;application manager&amp;quot; (as well as media consuming app) with ZUI features.&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C, OpenGL&lt;br /&gt;
* Bindings: Python, C#, Ruby&lt;br /&gt;
* Backends: GLX / SDL / EGL&lt;br /&gt;
* Media support: Gstreamer integration, Cairo graphics rendering, Pango fonts rendering&lt;br /&gt;
* Embedding: GTK embedding&lt;br /&gt;
&lt;br /&gt;
====Graff====&lt;br /&gt;
&lt;br /&gt;
An early demonstration of Graff, which ''is a lighweight high-performance graphics rendering library.''&lt;br /&gt;
http://www.mdk.org.pl/articles/2007/04/23/chapter-1-in-which-we-meet-graff&lt;br /&gt;
&lt;br /&gt;
Be sure to check out this demo (scrolling list with inertia scrolling)&lt;br /&gt;
http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Of course it will remind you of Apple iPhone's UI. But this one runs in software mode on Nokia N770&amp;amp;800 already. The most notable part of Graff seems to be the inertia and physics integration in general.&lt;br /&gt;
&lt;br /&gt;
====Pigment API====&lt;br /&gt;
&lt;br /&gt;
Fluendo's (the Gstreamer guys) ''[https://core.fluendo.com/pigment/trac Pigment] is a Python library designed to easily build user interfaces with embedded multimedia. Its design allows to use it on several platforms, thanks to a plugin system allowing to choose the underlying graphical API. Pigment is the rendering engine of Elisa, the Fluendo Media Center project.''&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C OpenGL&lt;br /&gt;
* Bindings: Python&lt;br /&gt;
* Backends: DirectFB OpenGL&lt;br /&gt;
* Media playback integration: using Gstreamer&lt;br /&gt;
&lt;br /&gt;
===Choosing===&lt;br /&gt;
&lt;br /&gt;
Benchmarking will be needed. We have therefore to define a std testing application that would allow to compare alternatives. &lt;br /&gt;
&lt;br /&gt;
Some Clutter VS Pigment information: http://www.taimila.com/?q=node/14&lt;br /&gt;
&lt;br /&gt;
==Improvement ideas==&lt;br /&gt;
&lt;br /&gt;
Please add here any idea that seems of relevance.&lt;br /&gt;
&lt;br /&gt;
===1D list scrolling: looped physics-driven item list===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
&lt;br /&gt;
[EDIT] Graff's inertia scrolling list example: http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
====Controls====&lt;br /&gt;
&lt;br /&gt;
* Sliding up/down = Single click + maintained for a minimal distance&lt;br /&gt;
&lt;br /&gt;
Effect: scroll in an inverted/negated fashion (slide down = scroll up, slide up = scroll down)&lt;br /&gt;
&lt;br /&gt;
When finger is released (i.e. touchscreen doesn't detect any press):&lt;br /&gt;
  if (last_speed_seen &amp;gt; 0 ) then keep this speed and acceleration, with friction&lt;br /&gt;
  else stop scrolling&lt;br /&gt;
&lt;br /&gt;
Scrolling here is seen as unidimensional, but can apply to bidimensional situations (ex: zoomed image) too&lt;br /&gt;
&lt;br /&gt;
* Action = quick double tap&lt;br /&gt;
&lt;br /&gt;
* Details/select = short single tap&lt;br /&gt;
&lt;br /&gt;
* Right click = long tap&lt;br /&gt;
&lt;br /&gt;
* Sliding left/right: switch sorting method&lt;br /&gt;
&lt;br /&gt;
====Parts to modify====&lt;br /&gt;
&lt;br /&gt;
''Having a scroll that isn't a 1:1 map to the user's action isn't hard. It's just an extra calculation in the scroll code.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;---- Where is the scroll code? :)&lt;br /&gt;
&lt;br /&gt;
* libmokoui&lt;br /&gt;
** [[Stylus_Scrolling | Stylus scrolling widget]]&lt;br /&gt;
** [[Finger_Scrolling | Finger scrolling wheel widget]]&lt;br /&gt;
* gtk&lt;br /&gt;
** [http://www.gtk.org/api/2.6/gtk/GtkVScrollbar.html GtkVScrollbar]&lt;br /&gt;
&lt;br /&gt;
The best would be to add the feature for both finger and stylus scrolling.&lt;br /&gt;
&lt;br /&gt;
TODO:&lt;br /&gt;
* make the entire list a &amp;quot;scrolling zone&amp;quot;, i.e. an overlay transparent scrolling widget?&lt;br /&gt;
* define controls&lt;br /&gt;
* add the inertia feature&lt;br /&gt;
&lt;br /&gt;
===1D Scrolling: inertia friction integration into openmoko's finger wheel=== &lt;br /&gt;
&lt;br /&gt;
The same, but for the wheel. It can be very short to do: you don't have 1:1 anymore, but, for example, 1/4 wheel turn = 1 item. It's demultiplicated, but has inertia.&lt;br /&gt;
&lt;br /&gt;
===Left-handed UI Support===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
A discussion on the community list identified a desire to have the ability to switch the OpenMoko UI into &amp;quot;left-handed&amp;quot; mode.  &lt;br /&gt;
&lt;br /&gt;
 The main problem is scrollbars, when they're on the right, dragging  &lt;br /&gt;
 the scrollbar left handed results in your hand covering the screen so  &lt;br /&gt;
 you can't see what you are doing. So having the option of scrollbars  &lt;br /&gt;
 on the left would be useful.&lt;br /&gt;
&lt;br /&gt;
 I don't think the whole screen should be mirrored! There are some elements&lt;br /&gt;
 that should remain..like the main top bar with the status icons and such.&lt;br /&gt;
 Scrollbars are the main thing I can think of right now.&lt;br /&gt;
&lt;br /&gt;
===Handgesture recognition proposals===&lt;br /&gt;
&lt;br /&gt;
====Using simple, localized warp as modifier key====&lt;br /&gt;
&lt;br /&gt;
As discussed on community list:&lt;br /&gt;
&lt;br /&gt;
  If you hold down one finger and tap the other one, the mouse pops over and back&lt;br /&gt;
  again. If you keep your second finger touching, the cursor follows it. When you&lt;br /&gt;
  release it, cursor goes back to first finger position. This could be a way to&lt;br /&gt;
  set a bounding box or turn on the mode. So the second finger can do something&lt;br /&gt;
  like rotating around the first, or increase or lower the distance to the first.&lt;br /&gt;
&lt;br /&gt;
* the so-called &amp;quot;first touch&amp;quot; can be done on the mokowheel zone itself: put your left thumb on the black area; if you touch the screen with another finger, there is a '''warp'''; the warp is detectable and allows to enter &amp;quot;fake multi-touchscreen mode&amp;quot;&lt;br /&gt;
* afterwards,&lt;br /&gt;
     * slide your right-hand finger down, it scrolls up&lt;br /&gt;
     * slide your right-hand finger up, it scrolls down&lt;br /&gt;
     * slide it left, next page/item&lt;br /&gt;
     * slide it right, previous page/item&lt;br /&gt;
     * do a circle: rotation&lt;br /&gt;
     * narrow towards the black circle: zoom -&lt;br /&gt;
     * go away: zoom +&lt;br /&gt;
* if you had kept your first finger on the black quarter circle, you can continue issuing other gestures&lt;br /&gt;
&lt;br /&gt;
The advantages of using simple origin-driven cursor warping as double touch detection criteria is that:&lt;br /&gt;
* you don't have to use the wheel as button, which would slow things down and generate errors (false button presses)&lt;br /&gt;
* simpler detection algorithms that can pass by the fluctuation due to pressure relative distribution&lt;br /&gt;
* the space taken by the wheel itself is &amp;quot;useless&amp;quot; (i.e. displays no information); using it as modifier allows to keep the screen clean for reading&lt;br /&gt;
* the origin of this zone lets use maximum surface of the screen, allowing more fine controlling&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_rotate_right.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_previous.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_down.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_zoom-.png]]&lt;br /&gt;
&lt;br /&gt;
*Pros:&lt;br /&gt;
** who said we need multi-touch hardware?&lt;br /&gt;
** this may be the easiest way (in terms of design/implementation complexity, reliability)&lt;br /&gt;
*Cons: &lt;br /&gt;
** no matter what we'll invent, we'll need two hands for on-the-move controlling&lt;br /&gt;
** what about left-handed people?&lt;br /&gt;
&lt;br /&gt;
====What is to modify ?====&lt;br /&gt;
&lt;br /&gt;
We need to emulate key presses. We need to work at a layer where we can get raw cursor coordinates. &amp;lt;---- X server layer?&lt;br /&gt;
&lt;br /&gt;
There is a fake keyboard module (for dev purposes) in the main kernel tree, which could be used to simulate keyboard presses (hence keeping keyboard-enabled apps unmodified).&lt;br /&gt;
&lt;br /&gt;
====Full multi-touch emulation====&lt;br /&gt;
&lt;br /&gt;
Doable, but tricky...&lt;br /&gt;
&lt;br /&gt;
==Preparing the multi touch==&lt;br /&gt;
&lt;br /&gt;
One day we might get multitouch devices. Let's get ready.&lt;br /&gt;
&lt;br /&gt;
===MPX===&lt;br /&gt;
 	&lt;br /&gt;
The Multi-Pointer X Server is a modification of the X server to support multiple mice and keyboards in X. It provides users with one cursor per device and one keyboard focus per keyboard. Each cursor can operate independently. MPX is the first multicursor windowing system and allows two-handed interaction with legacy applications, but also the creation of innovative applications and user interfaces. &lt;br /&gt;
&lt;br /&gt;
[http://wearables.unisa.edu.au/mpx/ The multipoint X server project]&lt;br /&gt;
&lt;br /&gt;
===MacSlow's Lowfat getting multitouched===&lt;br /&gt;
&lt;br /&gt;
http://dlai.jafu.dk/?p=1&lt;br /&gt;
&lt;br /&gt;
==Open questions==&lt;br /&gt;
&lt;br /&gt;
* will the neo/openmoko graphics system be powerful enough for such uses? I apple uses an OpenGL ES acceleration on this device (as well as on recent iPods), which is on the way with [[GTA02#.22Phase_2.22_.28GTA02.2C_.22Mass_Market.22.29|GTA02]].&lt;br /&gt;
* how does the touchscreen behave? We need a detailed touchscreen wiki information page, with visual traces. How hardware-specific is it?&lt;br /&gt;
* is multi touch really that awesome? I guess not.&lt;br /&gt;
&lt;br /&gt;
{{Languages|UI Improvements}}&lt;br /&gt;
&lt;br /&gt;
[[Category:User Interfaces| ]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/UI_Improvements</id>
		<title>UI Improvements</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/UI_Improvements"/>
				<updated>2007-07-27T17:08:22Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* MPX */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
  Obviously the tools are in the wild to build interfaces that could rival&lt;br /&gt;
  (or better IMO) anything Apple comes up with. We just need to organize&lt;br /&gt;
  this stuff. This would need hardware that can support dynamic&lt;br /&gt;
  interfaces. I can help here, too.&lt;br /&gt;
  sean@openmoko.com&lt;br /&gt;
&lt;br /&gt;
In fact, this place shall be dedicated to human-machine interactions improvements discussion;&lt;br /&gt;
&lt;br /&gt;
Human-machine interaction can be separated into several aspects:&lt;br /&gt;
* the physical contact/input device: the mono-touch touchscreen&lt;br /&gt;
* the graphics: &lt;br /&gt;
** accelerated rendering can add more consistency to zooming user interfaces, which seem to be quite an interesting concept for embedded scrensize-limited devices&lt;br /&gt;
** adding physics &amp;quot;look and feel&amp;quot; to (ex: menu's) behaviours can add coherence too&lt;br /&gt;
* the input methods&lt;br /&gt;
** the virtual keyboard&lt;br /&gt;
** handgestures&lt;br /&gt;
&lt;br /&gt;
==Finding inspiration ...==&lt;br /&gt;
&lt;br /&gt;
===Seen Live===&lt;br /&gt;
&lt;br /&gt;
'''Multi-touch'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=89sz8ExZndc Multi-Touchscreen experiments video @youtube]&lt;br /&gt;
*[http://www.youtube.com/watch?v=nPqqfVLQ_qY iPhone UI features demo @youtube]&lt;br /&gt;
&lt;br /&gt;
'''Zooming user interfaces'''&lt;br /&gt;
*[http://www.zenzui.com/products.html ZenZui], a [http://en.wikipedia.org/wiki/ZUI ZUI (zooming user interface)]&lt;br /&gt;
*[http://labs.live.com/Deepfish/videos.aspx Microsoft Bluefish's ZUI] (new mobile webbrowser)&lt;br /&gt;
*[http://googlesystem.blogspot.com/2007/04/opera-920-more-homepages-at-your.html Opera speed dial]&lt;br /&gt;
&lt;br /&gt;
'''Graphics'''&lt;br /&gt;
*[http://www.rasterman.com/files/eem.avi EEM], Rasterman's EFL libs on handelds proof of concept (doesn't DO anything, just showing off the EFLs on a handeld)&lt;br /&gt;
*[http://www.youtube.com/watch?v=8kLFPfaxQ6U&amp;amp;eurl= Nvidia's cutting-edge techno], an [http://www.khronos.org/openkode/ Openkode] demo.&lt;br /&gt;
&lt;br /&gt;
'''Science fiction'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=G_FS2TiK3AI UPMC Future?]&lt;br /&gt;
&lt;br /&gt;
'''Links:'''&lt;br /&gt;
*[http://elevate.sourceforge.net/links.html elevate project's links] sums up quite greatly the latest innovations in the desktop area&lt;br /&gt;
*[http://nooface.net/ Nooface] is a human-machine news site&lt;br /&gt;
*Asus-Intel's [http://www.hothardware.com/articles/Hands_on_with_the_ASUS_Eee/?page=2 Eee]'s interface&lt;br /&gt;
&lt;br /&gt;
===Clever hacks===&lt;br /&gt;
&lt;br /&gt;
It's been said that having no multitouch screen allows less freedom for innovation. Maybe we could get something out of our touchscreen drivers.&lt;br /&gt;
&lt;br /&gt;
Why ? Think of apple's scroll up/down feature on macbooks touchpads (which '''aren't multi touch''', it's a [http://iscroll2.sourceforge.net/ clever driver hack, iscroll2]):&lt;br /&gt;
&lt;br /&gt;
  To scroll, just place two fingers on your trackpad instead of one. Both fingers&lt;br /&gt;
  need to be placed next to each other horizontally (not vertically, the trackpad &lt;br /&gt;
  cannot detect that). Some people get better results with their finger spaced a&lt;br /&gt;
  little bit apart, while others prefer having the fingers right next to each other.&lt;br /&gt;
&lt;br /&gt;
  iScroll2 provides two scrolling modes: Linear and circular scrolling.&lt;br /&gt;
&lt;br /&gt;
  For linear scrolling, move the two fingers up/down or left/right in a straight &lt;br /&gt;
  line, respectively, to scroll in that direction.&lt;br /&gt;
&lt;br /&gt;
  Circular scrolling works in a way similar to the iPod's scroll wheel: Move the two&lt;br /&gt;
  fingers in a circle to scroll up or down, depending   on whether you move in a &lt;br /&gt;
  clockwise or counterclockwise direction.&lt;br /&gt;
&lt;br /&gt;
Maybe we can port/adapt/get inspiration from this macintosh driver.&lt;br /&gt;
&lt;br /&gt;
===n-D navigation: the polyhedra inspiration===&lt;br /&gt;
&lt;br /&gt;
When we want to navigate files, mp3s in an mp3 player, etc... Every control that the application needs is a button. What about looking at the polyhedrons? We could find one for each usage, with as many surrounding subzones that may be used as controls. Ex: you need 5 buttons, let's take a pentagon with 5 surrounding zones all around. That way, it's always optimized...&lt;br /&gt;
&lt;br /&gt;
http://en.wikipedia.org/wiki/Polyhedra&lt;br /&gt;
http://en.wikipedia.org/wiki/List_of_uniform_polyhedra&lt;br /&gt;
&lt;br /&gt;
===Our weapons===&lt;br /&gt;
&lt;br /&gt;
We can't improve the human-machine interface without knowing the strengths / weaknesses of our hardware; some of the weaknesses might turn out as exploitable features, some strengths as limiting constraints.&lt;br /&gt;
&lt;br /&gt;
====The touchscreen====&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What exactly does the touchscreen see when  you touch the screen with 2 fingers&lt;br /&gt;
  at the same time, when you move them, when you move only one of the 2, etc. I'm &lt;br /&gt;
  also interested in knowing how precise the touchscreen is (ex: refresh rate, &lt;br /&gt;
  possible pressure indication, ...)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* The output is the center of the bounding box of the touched area&lt;br /&gt;
* The touch point skips instantly on double touch&lt;br /&gt;
* Pressure has almost no effect on a single touch, but not so on a double touch. The relative pressures will cause a significant skewing effect towards the harder touch. You can easily move the pointer along the line between your two fingers by changing the relative pressure.&lt;br /&gt;
&lt;br /&gt;
Conclusions:&lt;br /&gt;
* we can detect double touch as jumps, and that's all&lt;br /&gt;
* no pressure&lt;br /&gt;
* This could be an interesting input method for games - e.g. holding the Neo in landscape view, letting each thumb rest on a specific input area; probably needs to be checked for usability with a real device&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when sliding two fingers in parallel up(L,R)-&amp;gt;down(L,R)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see a slide along the center line between your two fingers. In practice, you can't keep the pressure equal, so you will see some kind of zig-zag line somewhere between the two pressure points in the direction of your slide.&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when narrowing two fingers in slide (=zoom effect on iphone)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see the pointer stay at the center of the zoom movement. In practice, you can't keep the pressure equal for both fingers, so the pointer will move towards one of the two pressure points.&lt;br /&gt;
&lt;br /&gt;
====Graphics and computational capabilities====&lt;br /&gt;
&lt;br /&gt;
It would be good to report what performance the current hardware allows:&lt;br /&gt;
* There was no pure X11 benchmarking done (AFAIK) (how many fps at full VGA scrolling, ex: 1024*480 image scrolling?)&lt;br /&gt;
* what about the lcd reactivity? What if we don't see anything but blur while moving items fast?&lt;br /&gt;
&lt;br /&gt;
Please report here your impressions.&lt;br /&gt;
&lt;br /&gt;
==Areas of improvement==&lt;br /&gt;
&lt;br /&gt;
* OpenGL for fluid zooming interfaces (2D: the infinite sphere model, 1D: the infinite wheel of fortune/ribbon model, exposé)&lt;br /&gt;
* HandGestures&lt;br /&gt;
* Physics-model based improvements: inertia and friction&lt;br /&gt;
* multi touch screen for natural handgestures &lt;br /&gt;
* improved virtual keyboard&lt;br /&gt;
* switching to another GUI toolkit (EFLs)&lt;br /&gt;
&lt;br /&gt;
===Physics-inspired animation a.k.a. &amp;quot;Digital Physics&amp;quot;===&lt;br /&gt;
&lt;br /&gt;
If we want to add eye candy &amp;amp; usability to the UI (such as smooth realistic list scrolling, as seen in apple's&lt;br /&gt;
iphone demo on contacts lists for instance), we'll need a physics engine, so that moves &amp;amp; animations aren't all linear.&lt;br /&gt;
&lt;br /&gt;
The following aticle explains the [http://www.readwriteweb.com/archives/the_physics_of_iphone.php Digital Physics] term from the iPhone example.&lt;br /&gt;
&lt;br /&gt;
The most used technique for calculating trajectories and systems of related geometrical objects seems to be [http://en.wikipedia.org/wiki/Verlet_integration verlet integration] implementation; it is an alternative to Euler's integration method, using fast approximation. &lt;br /&gt;
&lt;br /&gt;
We may have no need for such a mathematical method at first, but perhaps there are other use cases. For instance, it may be useful to gesture recognition (i'm not aware if existing gesture recognition engines measure speed, acceleration...).&lt;br /&gt;
&lt;br /&gt;
====Open Dynamics Engine====&lt;br /&gt;
&lt;br /&gt;
ODE is an open source, high performance library for simulating rigid body dynamics. It is fully featured, stable, mature and platform independent with an easy to use C/C++ API. It has advanced joint types and integrated collision detection with friction. ODE is useful for simulating vehicles, objects in virtual reality environments and virtual creatures. It is currently used in many computer games, 3D authoring tools and simulation tools.&lt;br /&gt;
&lt;br /&gt;
http://www.ode.org/&lt;br /&gt;
&lt;br /&gt;
====Libakamaru====&lt;br /&gt;
&lt;br /&gt;
The [http://people.freedesktop.org/~krh/akamaru.git/ akamaru library] is the code behind [http://www.youtube.com/watch?v=VekgyKQoTeM kiba dock]'s fun and dynamic behaviour. It's dependencies are light (needs just GLib). It takes elasticity, friction, gravity into account.&lt;br /&gt;
&lt;br /&gt;
If you want to take a quick look at the code:&lt;br /&gt;
svn co http://svn.kiba-dock.org/akamaru/ akamaru&lt;br /&gt;
&lt;br /&gt;
The only (AFAIK) application using this library is kiba-dock, a *fun* app launcher, but we may find another use to it in the future.&lt;br /&gt;
&lt;br /&gt;
As suggested on the mailing list, it is mostly overkill for the uses we intend to have, but this library may be optimized already, the API can spare some time for too. Furthermore, ''Qui peut le plus, peut le moins''.&lt;br /&gt;
&lt;br /&gt;
====Verlet integration implementation from e17====&lt;br /&gt;
&lt;br /&gt;
There's an undergoing verlet integration implementation into the e17 project (by rephorm) see http://rephorm.com/news/tag/physics , so we may see some UI physics integration into e17 someday.&lt;br /&gt;
&lt;br /&gt;
====Robert Pernner's easy equations====&lt;br /&gt;
&lt;br /&gt;
http://www.robertpenner.com/easing/&lt;br /&gt;
&lt;br /&gt;
See the demo: implements non linear behaviour (actionscript), but may give inspiration&lt;br /&gt;
&lt;br /&gt;
===Extending the touchscreen capabilities and input methods===&lt;br /&gt;
&lt;br /&gt;
* '''Multitouchscreen emulation'''&lt;br /&gt;
&lt;br /&gt;
If we got it right, when touching the screen on a second place, the cursor oscillates between the two points depending on relative pressure distribution. Using averaging algorithms, we may have the opportunity to detect peculiar behaviours.&lt;br /&gt;
&lt;br /&gt;
We need raw data (x,y,t) from the real hardware for the following behaviours:&lt;br /&gt;
* slide two fingers in parallel - vertical up/down (scroll)&lt;br /&gt;
* turn the two fingers around (rotate)&lt;br /&gt;
* slide two fingers towards each other (zoom-)&lt;br /&gt;
* slide two fingers apart (zoom+)&lt;br /&gt;
&lt;br /&gt;
When touching the screen with two fingers at the same time, we necessarily see the two points, or are able to extrapolate the position of the second one. This solution can add feature, but will probably be little erratic...&lt;br /&gt;
&lt;br /&gt;
* '''Touchscreen kernel module hacking'''&lt;br /&gt;
&lt;br /&gt;
We may correct the &amp;quot;half distance&amp;quot; phenomenon on double touch: if double touch is detected, then assimilate the cursor as twice further than the first touch. It would allow finer control, but higher instability.&lt;br /&gt;
&lt;br /&gt;
The double touch detection may be implemented in the driver itself, as well as stabilization.&lt;br /&gt;
&lt;br /&gt;
* '''Other detectable behaviours'''&lt;br /&gt;
&lt;br /&gt;
The warping can be used in the 4 diagonals, plus the up/down/right/left cross:&lt;br /&gt;
&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
  - 1            -  - 1          2 -  - 1            -  -      2       -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -             2-  -              -  - 2            -  -      1       -&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
&lt;br /&gt;
It's not double touch, but two sequential presses with a short time in between (~0.5 s)&lt;br /&gt;
&lt;br /&gt;
===Improved virtual keyboard===&lt;br /&gt;
&lt;br /&gt;
One nice idea for virtual input is [http://www.micropp.se/openmoko/ finger-splash]&lt;br /&gt;
&lt;br /&gt;
Yet, optimization does not only apply to the plain one-letter-at-a-time input. We need some sort of T9 (dictionary-based input help). When typing a word, the first letter determines the next possible ones. Therefore, we may let disappear the less-probable following letters. Ex: type an L, there's no way an X follows...&lt;br /&gt;
&lt;br /&gt;
Hints: &lt;br /&gt;
* ZIP's huffmann compression applied to SMSs/mails for detecting the most used characters/words/sentences.&lt;br /&gt;
* html tag-clouds, one-letter tag clouds ; font size proportional to the probability of being used&lt;br /&gt;
&lt;br /&gt;
The most critical point is the initial disposition of the letters, before any letter is typed. We may also want to use horizontal two-parts keyboard (with the neo in hands like a psp..)&lt;br /&gt;
&lt;br /&gt;
The [http://www.strout.net/info/ideas/hexinput.html hexinput] concept is interesting. What about hiding the less probable letters and increasing the remaining ones during typing?&lt;br /&gt;
&lt;br /&gt;
===Towards OpenGL compositing===&lt;br /&gt;
&lt;br /&gt;
There are [http://www.hbmobile.org/wiki/index.php?title=GUI_Frameworks lots of possible GUI frameworks] with various software architectures that could be used for OpenMoko.&lt;br /&gt;
&lt;br /&gt;
GTA01 hardware uses GTK+/matchbox without hardware acceleration, and it's not enough: this is a first that a mobile Linux device has such a high DPI resolution. OpenGL ES compositing seems to have a bright future on embedded devices, because compositing seems to give natural zooming interfaces reality (at last!).&lt;br /&gt;
&lt;br /&gt;
Considering recent changes in destkop applications, opengl has a definite future. For instance, the expose (be it apple's or beryl's) is a very interesting and usable feature. Using compositing allows the physics metaphore: '''the human brain doesn't like &amp;quot;gaps&amp;quot;/jumps (for instance while scrolling a text), it needs continuity''', which can be provided by opengl. When you look at apple's iphone prototype, it's not just eye candy, it's maybe the most natural/human way of navigating, because it's sufficiently realistic for the brain to forget the non-physical nature of what's inside.&lt;br /&gt;
&lt;br /&gt;
So, opengl hardware will be needed in a more or less distant hardware, for 100% fluid operation. Benchmarking will be needed to compare the different alternatives that are cited further.&lt;br /&gt;
&lt;br /&gt;
====Switching to the Enlightenment Foundation Libraries====&lt;br /&gt;
&lt;br /&gt;
Evas is a powerful and power sparing canvas drawing library. It can be OpenGL accelerated. Python/Ruby bindings are available in the &amp;quot;proto&amp;quot; e17 cvs folder.&lt;br /&gt;
&lt;br /&gt;
''Moved [[E17|here]]''&lt;br /&gt;
&lt;br /&gt;
====Clutter Toolkit====&lt;br /&gt;
&lt;br /&gt;
Clutter, an [http://o-hand.com/ OpenedHand] project, is an open source software library for creating fast, visually rich graphical user interfaces. The most obvious example of potential usage is in media center type applications.&lt;br /&gt;
&lt;br /&gt;
http://clutter-project.org/&lt;br /&gt;
&lt;br /&gt;
Clutter uses OpenGL (and optionally '''OpenGL ES''') for rendering but with an API which hides the underlying GL complexity from the developer. The Clutter API is intended to be easy to use, efficient and flexible.&lt;br /&gt;
&lt;br /&gt;
It does integrate gstreamer (for easy media playback, even camera or mic inputs), allows pango text rendering, cairo graphics rendering. Provided bindings are python, C# and Ruby.&lt;br /&gt;
&lt;br /&gt;
GTK off screen rendering is supposed to be on it's way; once it is here, there will be a possibility of using GTK apps directly within OpenGL apps as textures, which would lead to the possibility of creating a full OpenGL &amp;quot;application manager&amp;quot; (as well as media consuming app) with ZUI features.&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C, OpenGL&lt;br /&gt;
* Bindings: Python, C#, Ruby&lt;br /&gt;
* Backends: GLX / SDL / EGL&lt;br /&gt;
* Media support: Gstreamer integration, Cairo graphics rendering, Pango fonts rendering&lt;br /&gt;
* Embedding: GTK embedding&lt;br /&gt;
&lt;br /&gt;
====Graff====&lt;br /&gt;
&lt;br /&gt;
An early demonstration of Graff, which ''is a lighweight high-performance graphics rendering library.''&lt;br /&gt;
http://www.mdk.org.pl/articles/2007/04/23/chapter-1-in-which-we-meet-graff&lt;br /&gt;
&lt;br /&gt;
Be sure to check out this demo (scrolling list with inertia scrolling)&lt;br /&gt;
http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Of course it will remind you of Apple iPhone's UI. But this one runs in software mode on Nokia N770&amp;amp;800 already. The most notable part of Graff seems to be the inertia and physics integration in general.&lt;br /&gt;
&lt;br /&gt;
====Pigment API====&lt;br /&gt;
&lt;br /&gt;
Fluendo's (the Gstreamer guys) ''[https://core.fluendo.com/pigment/trac Pigment] is a Python library designed to easily build user interfaces with embedded multimedia. Its design allows to use it on several platforms, thanks to a plugin system allowing to choose the underlying graphical API. Pigment is the rendering engine of Elisa, the Fluendo Media Center project.''&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C OpenGL&lt;br /&gt;
* Bindings: Python&lt;br /&gt;
* Backends: DirectFB OpenGL&lt;br /&gt;
* Media playback integration: using Gstreamer&lt;br /&gt;
&lt;br /&gt;
===Choosing===&lt;br /&gt;
&lt;br /&gt;
Benchmarking will be needed. We have therefore to define a std testing application that would allow to compare alternatives. &lt;br /&gt;
&lt;br /&gt;
Some Clutter VS Pigment information: http://www.taimila.com/?q=node/14&lt;br /&gt;
&lt;br /&gt;
==Improvement ideas==&lt;br /&gt;
&lt;br /&gt;
Please add here any idea that seems of relevance.&lt;br /&gt;
&lt;br /&gt;
===1D list scrolling: looped physics-driven item list===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
&lt;br /&gt;
[EDIT] Graff's inertia scrolling list example: http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Take an item list (ex: adress book), print it on a ribbon of paper, and glue it on a wheel (on the tire). You're looking in the front of it, so when you want to go from the A to Z, you touch the wheel and drag it up. When you let the wheel go, it goes furter, taken by it's inertia. Stop the wheel when you got your contact. Got the idea? That's why we may speak of an &amp;quot;infinite wheel&amp;quot;, so that the surface is flat. For our case here, we always want to display square content, so the [http://en.wikipedia.org/wiki/Uniform_prism n-sided uniform prism] analogy is mathematically more exact.&lt;br /&gt;
&lt;br /&gt;
Important features:&lt;br /&gt;
* '''weight''': the biggest the item list, the faster it scrolls; that way, you don't have to wait too long for big lists, and you don't miss your item on shorter lists&lt;br /&gt;
* '''friction''': there is friction where the wheel is fixed, so that the wheel doesn't turn infinitely; more friction on short lists, less on big ones&lt;br /&gt;
* the '''initial speed and acceleration vector''' you give it determines it's futher rotation&lt;br /&gt;
* it's &amp;quot;round&amp;quot;/cyclic, so you can '''browse the list in two directions'''&lt;br /&gt;
* we may want to add a &amp;quot;progression indicator&amp;quot;, ex the current alphabetical letter, with a font size adequate to the proportion of the number of entries in the letter subcategory, or a reduced map of the distribution of the first letters...&lt;br /&gt;
 &lt;br /&gt;
We can add &amp;quot;parallel wheels&amp;quot;, symbolizing different sorting methods. Slide long to the left / right to look at a different wheel = items organization.&lt;br /&gt;
&lt;br /&gt;
====Controls====&lt;br /&gt;
&lt;br /&gt;
* Sliding up/down = Single click + maintained for a minimal distance&lt;br /&gt;
&lt;br /&gt;
Effect: scroll in an inverted/negated fashion (slide down = scroll up, slide up = scroll down)&lt;br /&gt;
&lt;br /&gt;
When finger is released (i.e. touchscreen doesn't detect any press):&lt;br /&gt;
  if (last_speed_seen &amp;gt; 0 ) then keep this speed and acceleration, with friction&lt;br /&gt;
  else stop scrolling&lt;br /&gt;
&lt;br /&gt;
Scrolling here is seen as unidimensional, but can apply to bidimensional situations (ex: zoomed image) too&lt;br /&gt;
&lt;br /&gt;
* Action = quick double tap&lt;br /&gt;
&lt;br /&gt;
* Details/select = short single tap&lt;br /&gt;
&lt;br /&gt;
* Right click = long tap&lt;br /&gt;
&lt;br /&gt;
* Sliding left/right: switch sorting method&lt;br /&gt;
&lt;br /&gt;
====Parts to modify====&lt;br /&gt;
&lt;br /&gt;
''Having a scroll that isn't a 1:1 map to the user's action isn't hard. It's just an extra calculation in the scroll code.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;---- Where is the scroll code? :)&lt;br /&gt;
&lt;br /&gt;
* libmokoui&lt;br /&gt;
** [[Stylus_Scrolling | Stylus scrolling widget]]&lt;br /&gt;
** [[Finger_Scrolling | Finger scrolling wheel widget]]&lt;br /&gt;
* gtk&lt;br /&gt;
** [http://www.gtk.org/api/2.6/gtk/GtkVScrollbar.html GtkVScrollbar]&lt;br /&gt;
&lt;br /&gt;
The best would be to add the feature for both finger and stylus scrolling.&lt;br /&gt;
&lt;br /&gt;
TODO:&lt;br /&gt;
* make the entire list a &amp;quot;scrolling zone&amp;quot;, i.e. an overlay transparent scrolling widget?&lt;br /&gt;
* define controls&lt;br /&gt;
* add the inertia feature&lt;br /&gt;
&lt;br /&gt;
===1D Scrolling: inertia friction integration into openmoko's finger wheel=== &lt;br /&gt;
&lt;br /&gt;
The same, but for the wheel. It can be very short to do: you don't have 1:1 anymore, but, for example, 1/4 wheel turn = 1 item. It's demultiplicated, but has inertia.&lt;br /&gt;
&lt;br /&gt;
===Left-handed UI Support===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
A discussion on the community list identified a desire to have the ability to switch the OpenMoko UI into &amp;quot;left-handed&amp;quot; mode.  &lt;br /&gt;
&lt;br /&gt;
 The main problem is scrollbars, when they're on the right, dragging  &lt;br /&gt;
 the scrollbar left handed results in your hand covering the screen so  &lt;br /&gt;
 you can't see what you are doing. So having the option of scrollbars  &lt;br /&gt;
 on the left would be useful.&lt;br /&gt;
&lt;br /&gt;
 I don't think the whole screen should be mirrored! There are some elements&lt;br /&gt;
 that should remain..like the main top bar with the status icons and such.&lt;br /&gt;
 Scrollbars are the main thing I can think of right now.&lt;br /&gt;
&lt;br /&gt;
===Handgesture recognition proposals===&lt;br /&gt;
&lt;br /&gt;
====Using simple, localized warp as modifier key====&lt;br /&gt;
&lt;br /&gt;
As discussed on community list:&lt;br /&gt;
&lt;br /&gt;
  If you hold down one finger and tap the other one, the mouse pops over and back&lt;br /&gt;
  again. If you keep your second finger touching, the cursor follows it. When you&lt;br /&gt;
  release it, cursor goes back to first finger position. This could be a way to&lt;br /&gt;
  set a bounding box or turn on the mode. So the second finger can do something&lt;br /&gt;
  like rotating around the first, or increase or lower the distance to the first.&lt;br /&gt;
&lt;br /&gt;
* the so-called &amp;quot;first touch&amp;quot; can be done on the mokowheel zone itself: put your left thumb on the black area; if you touch the screen with another finger, there is a '''warp'''; the warp is detectable and allows to enter &amp;quot;fake multi-touchscreen mode&amp;quot;&lt;br /&gt;
* afterwards,&lt;br /&gt;
     * slide your right-hand finger down, it scrolls up&lt;br /&gt;
     * slide your right-hand finger up, it scrolls down&lt;br /&gt;
     * slide it left, next page/item&lt;br /&gt;
     * slide it right, previous page/item&lt;br /&gt;
     * do a circle: rotation&lt;br /&gt;
     * narrow towards the black circle: zoom -&lt;br /&gt;
     * go away: zoom +&lt;br /&gt;
* if you had kept your first finger on the black quarter circle, you can continue issuing other gestures&lt;br /&gt;
&lt;br /&gt;
The advantages of using simple origin-driven cursor warping as double touch detection criteria is that:&lt;br /&gt;
* you don't have to use the wheel as button, which would slow things down and generate errors (false button presses)&lt;br /&gt;
* simpler detection algorithms that can pass by the fluctuation due to pressure relative distribution&lt;br /&gt;
* the space taken by the wheel itself is &amp;quot;useless&amp;quot; (i.e. displays no information); using it as modifier allows to keep the screen clean for reading&lt;br /&gt;
* the origin of this zone lets use maximum surface of the screen, allowing more fine controlling&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_rotate_right.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_previous.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_down.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_zoom-.png]]&lt;br /&gt;
&lt;br /&gt;
*Pros:&lt;br /&gt;
** who said we need multi-touch hardware?&lt;br /&gt;
** this may be the easiest way (in terms of design/implementation complexity, reliability)&lt;br /&gt;
*Cons: &lt;br /&gt;
** no matter what we'll invent, we'll need two hands for on-the-move controlling&lt;br /&gt;
** what about left-handed people?&lt;br /&gt;
&lt;br /&gt;
====What is to modify ?====&lt;br /&gt;
&lt;br /&gt;
We need to emulate key presses. We need to work at a layer where we can get raw cursor coordinates. &amp;lt;---- X server layer?&lt;br /&gt;
&lt;br /&gt;
There is a fake keyboard module (for dev purposes) in the main kernel tree, which could be used to simulate keyboard presses (hence keeping keyboard-enabled apps unmodified).&lt;br /&gt;
&lt;br /&gt;
====Full multi-touch emulation====&lt;br /&gt;
&lt;br /&gt;
Doable, but tricky...&lt;br /&gt;
&lt;br /&gt;
==Preparing the multi touch==&lt;br /&gt;
&lt;br /&gt;
One day we might get multitouch devices. Let's get ready.&lt;br /&gt;
&lt;br /&gt;
===MPX===&lt;br /&gt;
 	&lt;br /&gt;
The Multi-Pointer X Server is a modification of the X server to support multiple mice and keyboards in X. It provides users with one cursor per device and one keyboard focus per keyboard. Each cursor can operate independently. MPX is the first multicursor windowing system and allows two-handed interaction with legacy applications, but also the creation of innovative applications and user interfaces. &lt;br /&gt;
&lt;br /&gt;
[http://wearables.unisa.edu.au/mpx/ The multipoint X server project]&lt;br /&gt;
&lt;br /&gt;
===MacSlow's Lowfat getting multitouched===&lt;br /&gt;
&lt;br /&gt;
http://dlai.jafu.dk/?p=1&lt;br /&gt;
&lt;br /&gt;
==Open questions==&lt;br /&gt;
&lt;br /&gt;
* will the neo/openmoko graphics system be powerful enough for such uses? I apple uses an OpenGL ES acceleration on this device (as well as on recent iPods), which is on the way with [[GTA02#.22Phase_2.22_.28GTA02.2C_.22Mass_Market.22.29|GTA02]].&lt;br /&gt;
* how does the touchscreen behave? We need a detailed touchscreen wiki information page, with visual traces. How hardware-specific is it?&lt;br /&gt;
* is multi touch really that awesome? I guess not.&lt;br /&gt;
&lt;br /&gt;
{{Languages|UI Improvements}}&lt;br /&gt;
&lt;br /&gt;
[[Category:User Interfaces| ]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/UI_Improvements</id>
		<title>UI Improvements</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/UI_Improvements"/>
				<updated>2007-07-27T17:08:05Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Full multi-touch emulation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
  Obviously the tools are in the wild to build interfaces that could rival&lt;br /&gt;
  (or better IMO) anything Apple comes up with. We just need to organize&lt;br /&gt;
  this stuff. This would need hardware that can support dynamic&lt;br /&gt;
  interfaces. I can help here, too.&lt;br /&gt;
  sean@openmoko.com&lt;br /&gt;
&lt;br /&gt;
In fact, this place shall be dedicated to human-machine interactions improvements discussion;&lt;br /&gt;
&lt;br /&gt;
Human-machine interaction can be separated into several aspects:&lt;br /&gt;
* the physical contact/input device: the mono-touch touchscreen&lt;br /&gt;
* the graphics: &lt;br /&gt;
** accelerated rendering can add more consistency to zooming user interfaces, which seem to be quite an interesting concept for embedded scrensize-limited devices&lt;br /&gt;
** adding physics &amp;quot;look and feel&amp;quot; to (ex: menu's) behaviours can add coherence too&lt;br /&gt;
* the input methods&lt;br /&gt;
** the virtual keyboard&lt;br /&gt;
** handgestures&lt;br /&gt;
&lt;br /&gt;
==Finding inspiration ...==&lt;br /&gt;
&lt;br /&gt;
===Seen Live===&lt;br /&gt;
&lt;br /&gt;
'''Multi-touch'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=89sz8ExZndc Multi-Touchscreen experiments video @youtube]&lt;br /&gt;
*[http://www.youtube.com/watch?v=nPqqfVLQ_qY iPhone UI features demo @youtube]&lt;br /&gt;
&lt;br /&gt;
'''Zooming user interfaces'''&lt;br /&gt;
*[http://www.zenzui.com/products.html ZenZui], a [http://en.wikipedia.org/wiki/ZUI ZUI (zooming user interface)]&lt;br /&gt;
*[http://labs.live.com/Deepfish/videos.aspx Microsoft Bluefish's ZUI] (new mobile webbrowser)&lt;br /&gt;
*[http://googlesystem.blogspot.com/2007/04/opera-920-more-homepages-at-your.html Opera speed dial]&lt;br /&gt;
&lt;br /&gt;
'''Graphics'''&lt;br /&gt;
*[http://www.rasterman.com/files/eem.avi EEM], Rasterman's EFL libs on handelds proof of concept (doesn't DO anything, just showing off the EFLs on a handeld)&lt;br /&gt;
*[http://www.youtube.com/watch?v=8kLFPfaxQ6U&amp;amp;eurl= Nvidia's cutting-edge techno], an [http://www.khronos.org/openkode/ Openkode] demo.&lt;br /&gt;
&lt;br /&gt;
'''Science fiction'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=G_FS2TiK3AI UPMC Future?]&lt;br /&gt;
&lt;br /&gt;
'''Links:'''&lt;br /&gt;
*[http://elevate.sourceforge.net/links.html elevate project's links] sums up quite greatly the latest innovations in the desktop area&lt;br /&gt;
*[http://nooface.net/ Nooface] is a human-machine news site&lt;br /&gt;
*Asus-Intel's [http://www.hothardware.com/articles/Hands_on_with_the_ASUS_Eee/?page=2 Eee]'s interface&lt;br /&gt;
&lt;br /&gt;
===Clever hacks===&lt;br /&gt;
&lt;br /&gt;
It's been said that having no multitouch screen allows less freedom for innovation. Maybe we could get something out of our touchscreen drivers.&lt;br /&gt;
&lt;br /&gt;
Why ? Think of apple's scroll up/down feature on macbooks touchpads (which '''aren't multi touch''', it's a [http://iscroll2.sourceforge.net/ clever driver hack, iscroll2]):&lt;br /&gt;
&lt;br /&gt;
  To scroll, just place two fingers on your trackpad instead of one. Both fingers&lt;br /&gt;
  need to be placed next to each other horizontally (not vertically, the trackpad &lt;br /&gt;
  cannot detect that). Some people get better results with their finger spaced a&lt;br /&gt;
  little bit apart, while others prefer having the fingers right next to each other.&lt;br /&gt;
&lt;br /&gt;
  iScroll2 provides two scrolling modes: Linear and circular scrolling.&lt;br /&gt;
&lt;br /&gt;
  For linear scrolling, move the two fingers up/down or left/right in a straight &lt;br /&gt;
  line, respectively, to scroll in that direction.&lt;br /&gt;
&lt;br /&gt;
  Circular scrolling works in a way similar to the iPod's scroll wheel: Move the two&lt;br /&gt;
  fingers in a circle to scroll up or down, depending   on whether you move in a &lt;br /&gt;
  clockwise or counterclockwise direction.&lt;br /&gt;
&lt;br /&gt;
Maybe we can port/adapt/get inspiration from this macintosh driver.&lt;br /&gt;
&lt;br /&gt;
===n-D navigation: the polyhedra inspiration===&lt;br /&gt;
&lt;br /&gt;
When we want to navigate files, mp3s in an mp3 player, etc... Every control that the application needs is a button. What about looking at the polyhedrons? We could find one for each usage, with as many surrounding subzones that may be used as controls. Ex: you need 5 buttons, let's take a pentagon with 5 surrounding zones all around. That way, it's always optimized...&lt;br /&gt;
&lt;br /&gt;
http://en.wikipedia.org/wiki/Polyhedra&lt;br /&gt;
http://en.wikipedia.org/wiki/List_of_uniform_polyhedra&lt;br /&gt;
&lt;br /&gt;
===Our weapons===&lt;br /&gt;
&lt;br /&gt;
We can't improve the human-machine interface without knowing the strengths / weaknesses of our hardware; some of the weaknesses might turn out as exploitable features, some strengths as limiting constraints.&lt;br /&gt;
&lt;br /&gt;
====The touchscreen====&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What exactly does the touchscreen see when  you touch the screen with 2 fingers&lt;br /&gt;
  at the same time, when you move them, when you move only one of the 2, etc. I'm &lt;br /&gt;
  also interested in knowing how precise the touchscreen is (ex: refresh rate, &lt;br /&gt;
  possible pressure indication, ...)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* The output is the center of the bounding box of the touched area&lt;br /&gt;
* The touch point skips instantly on double touch&lt;br /&gt;
* Pressure has almost no effect on a single touch, but not so on a double touch. The relative pressures will cause a significant skewing effect towards the harder touch. You can easily move the pointer along the line between your two fingers by changing the relative pressure.&lt;br /&gt;
&lt;br /&gt;
Conclusions:&lt;br /&gt;
* we can detect double touch as jumps, and that's all&lt;br /&gt;
* no pressure&lt;br /&gt;
* This could be an interesting input method for games - e.g. holding the Neo in landscape view, letting each thumb rest on a specific input area; probably needs to be checked for usability with a real device&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when sliding two fingers in parallel up(L,R)-&amp;gt;down(L,R)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see a slide along the center line between your two fingers. In practice, you can't keep the pressure equal, so you will see some kind of zig-zag line somewhere between the two pressure points in the direction of your slide.&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when narrowing two fingers in slide (=zoom effect on iphone)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see the pointer stay at the center of the zoom movement. In practice, you can't keep the pressure equal for both fingers, so the pointer will move towards one of the two pressure points.&lt;br /&gt;
&lt;br /&gt;
====Graphics and computational capabilities====&lt;br /&gt;
&lt;br /&gt;
It would be good to report what performance the current hardware allows:&lt;br /&gt;
* There was no pure X11 benchmarking done (AFAIK) (how many fps at full VGA scrolling, ex: 1024*480 image scrolling?)&lt;br /&gt;
* what about the lcd reactivity? What if we don't see anything but blur while moving items fast?&lt;br /&gt;
&lt;br /&gt;
Please report here your impressions.&lt;br /&gt;
&lt;br /&gt;
==Areas of improvement==&lt;br /&gt;
&lt;br /&gt;
* OpenGL for fluid zooming interfaces (2D: the infinite sphere model, 1D: the infinite wheel of fortune/ribbon model, exposé)&lt;br /&gt;
* HandGestures&lt;br /&gt;
* Physics-model based improvements: inertia and friction&lt;br /&gt;
* multi touch screen for natural handgestures &lt;br /&gt;
* improved virtual keyboard&lt;br /&gt;
* switching to another GUI toolkit (EFLs)&lt;br /&gt;
&lt;br /&gt;
===Physics-inspired animation a.k.a. &amp;quot;Digital Physics&amp;quot;===&lt;br /&gt;
&lt;br /&gt;
If we want to add eye candy &amp;amp; usability to the UI (such as smooth realistic list scrolling, as seen in apple's&lt;br /&gt;
iphone demo on contacts lists for instance), we'll need a physics engine, so that moves &amp;amp; animations aren't all linear.&lt;br /&gt;
&lt;br /&gt;
The following aticle explains the [http://www.readwriteweb.com/archives/the_physics_of_iphone.php Digital Physics] term from the iPhone example.&lt;br /&gt;
&lt;br /&gt;
The most used technique for calculating trajectories and systems of related geometrical objects seems to be [http://en.wikipedia.org/wiki/Verlet_integration verlet integration] implementation; it is an alternative to Euler's integration method, using fast approximation. &lt;br /&gt;
&lt;br /&gt;
We may have no need for such a mathematical method at first, but perhaps there are other use cases. For instance, it may be useful to gesture recognition (i'm not aware if existing gesture recognition engines measure speed, acceleration...).&lt;br /&gt;
&lt;br /&gt;
====Open Dynamics Engine====&lt;br /&gt;
&lt;br /&gt;
ODE is an open source, high performance library for simulating rigid body dynamics. It is fully featured, stable, mature and platform independent with an easy to use C/C++ API. It has advanced joint types and integrated collision detection with friction. ODE is useful for simulating vehicles, objects in virtual reality environments and virtual creatures. It is currently used in many computer games, 3D authoring tools and simulation tools.&lt;br /&gt;
&lt;br /&gt;
http://www.ode.org/&lt;br /&gt;
&lt;br /&gt;
====Libakamaru====&lt;br /&gt;
&lt;br /&gt;
The [http://people.freedesktop.org/~krh/akamaru.git/ akamaru library] is the code behind [http://www.youtube.com/watch?v=VekgyKQoTeM kiba dock]'s fun and dynamic behaviour. It's dependencies are light (needs just GLib). It takes elasticity, friction, gravity into account.&lt;br /&gt;
&lt;br /&gt;
If you want to take a quick look at the code:&lt;br /&gt;
svn co http://svn.kiba-dock.org/akamaru/ akamaru&lt;br /&gt;
&lt;br /&gt;
The only (AFAIK) application using this library is kiba-dock, a *fun* app launcher, but we may find another use to it in the future.&lt;br /&gt;
&lt;br /&gt;
As suggested on the mailing list, it is mostly overkill for the uses we intend to have, but this library may be optimized already, the API can spare some time for too. Furthermore, ''Qui peut le plus, peut le moins''.&lt;br /&gt;
&lt;br /&gt;
====Verlet integration implementation from e17====&lt;br /&gt;
&lt;br /&gt;
There's an undergoing verlet integration implementation into the e17 project (by rephorm) see http://rephorm.com/news/tag/physics , so we may see some UI physics integration into e17 someday.&lt;br /&gt;
&lt;br /&gt;
====Robert Pernner's easy equations====&lt;br /&gt;
&lt;br /&gt;
http://www.robertpenner.com/easing/&lt;br /&gt;
&lt;br /&gt;
See the demo: implements non linear behaviour (actionscript), but may give inspiration&lt;br /&gt;
&lt;br /&gt;
===Extending the touchscreen capabilities and input methods===&lt;br /&gt;
&lt;br /&gt;
* '''Multitouchscreen emulation'''&lt;br /&gt;
&lt;br /&gt;
If we got it right, when touching the screen on a second place, the cursor oscillates between the two points depending on relative pressure distribution. Using averaging algorithms, we may have the opportunity to detect peculiar behaviours.&lt;br /&gt;
&lt;br /&gt;
We need raw data (x,y,t) from the real hardware for the following behaviours:&lt;br /&gt;
* slide two fingers in parallel - vertical up/down (scroll)&lt;br /&gt;
* turn the two fingers around (rotate)&lt;br /&gt;
* slide two fingers towards each other (zoom-)&lt;br /&gt;
* slide two fingers apart (zoom+)&lt;br /&gt;
&lt;br /&gt;
When touching the screen with two fingers at the same time, we necessarily see the two points, or are able to extrapolate the position of the second one. This solution can add feature, but will probably be little erratic...&lt;br /&gt;
&lt;br /&gt;
* '''Touchscreen kernel module hacking'''&lt;br /&gt;
&lt;br /&gt;
We may correct the &amp;quot;half distance&amp;quot; phenomenon on double touch: if double touch is detected, then assimilate the cursor as twice further than the first touch. It would allow finer control, but higher instability.&lt;br /&gt;
&lt;br /&gt;
The double touch detection may be implemented in the driver itself, as well as stabilization.&lt;br /&gt;
&lt;br /&gt;
* '''Other detectable behaviours'''&lt;br /&gt;
&lt;br /&gt;
The warping can be used in the 4 diagonals, plus the up/down/right/left cross:&lt;br /&gt;
&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
  - 1            -  - 1          2 -  - 1            -  -      2       -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -             2-  -              -  - 2            -  -      1       -&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
&lt;br /&gt;
It's not double touch, but two sequential presses with a short time in between (~0.5 s)&lt;br /&gt;
&lt;br /&gt;
===Improved virtual keyboard===&lt;br /&gt;
&lt;br /&gt;
One nice idea for virtual input is [http://www.micropp.se/openmoko/ finger-splash]&lt;br /&gt;
&lt;br /&gt;
Yet, optimization does not only apply to the plain one-letter-at-a-time input. We need some sort of T9 (dictionary-based input help). When typing a word, the first letter determines the next possible ones. Therefore, we may let disappear the less-probable following letters. Ex: type an L, there's no way an X follows...&lt;br /&gt;
&lt;br /&gt;
Hints: &lt;br /&gt;
* ZIP's huffmann compression applied to SMSs/mails for detecting the most used characters/words/sentences.&lt;br /&gt;
* html tag-clouds, one-letter tag clouds ; font size proportional to the probability of being used&lt;br /&gt;
&lt;br /&gt;
The most critical point is the initial disposition of the letters, before any letter is typed. We may also want to use horizontal two-parts keyboard (with the neo in hands like a psp..)&lt;br /&gt;
&lt;br /&gt;
The [http://www.strout.net/info/ideas/hexinput.html hexinput] concept is interesting. What about hiding the less probable letters and increasing the remaining ones during typing?&lt;br /&gt;
&lt;br /&gt;
===Towards OpenGL compositing===&lt;br /&gt;
&lt;br /&gt;
There are [http://www.hbmobile.org/wiki/index.php?title=GUI_Frameworks lots of possible GUI frameworks] with various software architectures that could be used for OpenMoko.&lt;br /&gt;
&lt;br /&gt;
GTA01 hardware uses GTK+/matchbox without hardware acceleration, and it's not enough: this is a first that a mobile Linux device has such a high DPI resolution. OpenGL ES compositing seems to have a bright future on embedded devices, because compositing seems to give natural zooming interfaces reality (at last!).&lt;br /&gt;
&lt;br /&gt;
Considering recent changes in destkop applications, opengl has a definite future. For instance, the expose (be it apple's or beryl's) is a very interesting and usable feature. Using compositing allows the physics metaphore: '''the human brain doesn't like &amp;quot;gaps&amp;quot;/jumps (for instance while scrolling a text), it needs continuity''', which can be provided by opengl. When you look at apple's iphone prototype, it's not just eye candy, it's maybe the most natural/human way of navigating, because it's sufficiently realistic for the brain to forget the non-physical nature of what's inside.&lt;br /&gt;
&lt;br /&gt;
So, opengl hardware will be needed in a more or less distant hardware, for 100% fluid operation. Benchmarking will be needed to compare the different alternatives that are cited further.&lt;br /&gt;
&lt;br /&gt;
====Switching to the Enlightenment Foundation Libraries====&lt;br /&gt;
&lt;br /&gt;
Evas is a powerful and power sparing canvas drawing library. It can be OpenGL accelerated. Python/Ruby bindings are available in the &amp;quot;proto&amp;quot; e17 cvs folder.&lt;br /&gt;
&lt;br /&gt;
''Moved [[E17|here]]''&lt;br /&gt;
&lt;br /&gt;
====Clutter Toolkit====&lt;br /&gt;
&lt;br /&gt;
Clutter, an [http://o-hand.com/ OpenedHand] project, is an open source software library for creating fast, visually rich graphical user interfaces. The most obvious example of potential usage is in media center type applications.&lt;br /&gt;
&lt;br /&gt;
http://clutter-project.org/&lt;br /&gt;
&lt;br /&gt;
Clutter uses OpenGL (and optionally '''OpenGL ES''') for rendering but with an API which hides the underlying GL complexity from the developer. The Clutter API is intended to be easy to use, efficient and flexible.&lt;br /&gt;
&lt;br /&gt;
It does integrate gstreamer (for easy media playback, even camera or mic inputs), allows pango text rendering, cairo graphics rendering. Provided bindings are python, C# and Ruby.&lt;br /&gt;
&lt;br /&gt;
GTK off screen rendering is supposed to be on it's way; once it is here, there will be a possibility of using GTK apps directly within OpenGL apps as textures, which would lead to the possibility of creating a full OpenGL &amp;quot;application manager&amp;quot; (as well as media consuming app) with ZUI features.&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C, OpenGL&lt;br /&gt;
* Bindings: Python, C#, Ruby&lt;br /&gt;
* Backends: GLX / SDL / EGL&lt;br /&gt;
* Media support: Gstreamer integration, Cairo graphics rendering, Pango fonts rendering&lt;br /&gt;
* Embedding: GTK embedding&lt;br /&gt;
&lt;br /&gt;
====Graff====&lt;br /&gt;
&lt;br /&gt;
An early demonstration of Graff, which ''is a lighweight high-performance graphics rendering library.''&lt;br /&gt;
http://www.mdk.org.pl/articles/2007/04/23/chapter-1-in-which-we-meet-graff&lt;br /&gt;
&lt;br /&gt;
Be sure to check out this demo (scrolling list with inertia scrolling)&lt;br /&gt;
http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Of course it will remind you of Apple iPhone's UI. But this one runs in software mode on Nokia N770&amp;amp;800 already. The most notable part of Graff seems to be the inertia and physics integration in general.&lt;br /&gt;
&lt;br /&gt;
====Pigment API====&lt;br /&gt;
&lt;br /&gt;
Fluendo's (the Gstreamer guys) ''[https://core.fluendo.com/pigment/trac Pigment] is a Python library designed to easily build user interfaces with embedded multimedia. Its design allows to use it on several platforms, thanks to a plugin system allowing to choose the underlying graphical API. Pigment is the rendering engine of Elisa, the Fluendo Media Center project.''&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C OpenGL&lt;br /&gt;
* Bindings: Python&lt;br /&gt;
* Backends: DirectFB OpenGL&lt;br /&gt;
* Media playback integration: using Gstreamer&lt;br /&gt;
&lt;br /&gt;
===Choosing===&lt;br /&gt;
&lt;br /&gt;
Benchmarking will be needed. We have therefore to define a std testing application that would allow to compare alternatives. &lt;br /&gt;
&lt;br /&gt;
Some Clutter VS Pigment information: http://www.taimila.com/?q=node/14&lt;br /&gt;
&lt;br /&gt;
==Improvement ideas==&lt;br /&gt;
&lt;br /&gt;
Please add here any idea that seems of relevance.&lt;br /&gt;
&lt;br /&gt;
===1D list scrolling: looped physics-driven item list===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
&lt;br /&gt;
[EDIT] Graff's inertia scrolling list example: http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Take an item list (ex: adress book), print it on a ribbon of paper, and glue it on a wheel (on the tire). You're looking in the front of it, so when you want to go from the A to Z, you touch the wheel and drag it up. When you let the wheel go, it goes furter, taken by it's inertia. Stop the wheel when you got your contact. Got the idea? That's why we may speak of an &amp;quot;infinite wheel&amp;quot;, so that the surface is flat. For our case here, we always want to display square content, so the [http://en.wikipedia.org/wiki/Uniform_prism n-sided uniform prism] analogy is mathematically more exact.&lt;br /&gt;
&lt;br /&gt;
Important features:&lt;br /&gt;
* '''weight''': the biggest the item list, the faster it scrolls; that way, you don't have to wait too long for big lists, and you don't miss your item on shorter lists&lt;br /&gt;
* '''friction''': there is friction where the wheel is fixed, so that the wheel doesn't turn infinitely; more friction on short lists, less on big ones&lt;br /&gt;
* the '''initial speed and acceleration vector''' you give it determines it's futher rotation&lt;br /&gt;
* it's &amp;quot;round&amp;quot;/cyclic, so you can '''browse the list in two directions'''&lt;br /&gt;
* we may want to add a &amp;quot;progression indicator&amp;quot;, ex the current alphabetical letter, with a font size adequate to the proportion of the number of entries in the letter subcategory, or a reduced map of the distribution of the first letters...&lt;br /&gt;
 &lt;br /&gt;
We can add &amp;quot;parallel wheels&amp;quot;, symbolizing different sorting methods. Slide long to the left / right to look at a different wheel = items organization.&lt;br /&gt;
&lt;br /&gt;
====Controls====&lt;br /&gt;
&lt;br /&gt;
* Sliding up/down = Single click + maintained for a minimal distance&lt;br /&gt;
&lt;br /&gt;
Effect: scroll in an inverted/negated fashion (slide down = scroll up, slide up = scroll down)&lt;br /&gt;
&lt;br /&gt;
When finger is released (i.e. touchscreen doesn't detect any press):&lt;br /&gt;
  if (last_speed_seen &amp;gt; 0 ) then keep this speed and acceleration, with friction&lt;br /&gt;
  else stop scrolling&lt;br /&gt;
&lt;br /&gt;
Scrolling here is seen as unidimensional, but can apply to bidimensional situations (ex: zoomed image) too&lt;br /&gt;
&lt;br /&gt;
* Action = quick double tap&lt;br /&gt;
&lt;br /&gt;
* Details/select = short single tap&lt;br /&gt;
&lt;br /&gt;
* Right click = long tap&lt;br /&gt;
&lt;br /&gt;
* Sliding left/right: switch sorting method&lt;br /&gt;
&lt;br /&gt;
====Parts to modify====&lt;br /&gt;
&lt;br /&gt;
''Having a scroll that isn't a 1:1 map to the user's action isn't hard. It's just an extra calculation in the scroll code.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;---- Where is the scroll code? :)&lt;br /&gt;
&lt;br /&gt;
* libmokoui&lt;br /&gt;
** [[Stylus_Scrolling | Stylus scrolling widget]]&lt;br /&gt;
** [[Finger_Scrolling | Finger scrolling wheel widget]]&lt;br /&gt;
* gtk&lt;br /&gt;
** [http://www.gtk.org/api/2.6/gtk/GtkVScrollbar.html GtkVScrollbar]&lt;br /&gt;
&lt;br /&gt;
The best would be to add the feature for both finger and stylus scrolling.&lt;br /&gt;
&lt;br /&gt;
TODO:&lt;br /&gt;
* make the entire list a &amp;quot;scrolling zone&amp;quot;, i.e. an overlay transparent scrolling widget?&lt;br /&gt;
* define controls&lt;br /&gt;
* add the inertia feature&lt;br /&gt;
&lt;br /&gt;
===1D Scrolling: inertia friction integration into openmoko's finger wheel=== &lt;br /&gt;
&lt;br /&gt;
The same, but for the wheel. It can be very short to do: you don't have 1:1 anymore, but, for example, 1/4 wheel turn = 1 item. It's demultiplicated, but has inertia.&lt;br /&gt;
&lt;br /&gt;
===Left-handed UI Support===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
A discussion on the community list identified a desire to have the ability to switch the OpenMoko UI into &amp;quot;left-handed&amp;quot; mode.  &lt;br /&gt;
&lt;br /&gt;
 The main problem is scrollbars, when they're on the right, dragging  &lt;br /&gt;
 the scrollbar left handed results in your hand covering the screen so  &lt;br /&gt;
 you can't see what you are doing. So having the option of scrollbars  &lt;br /&gt;
 on the left would be useful.&lt;br /&gt;
&lt;br /&gt;
 I don't think the whole screen should be mirrored! There are some elements&lt;br /&gt;
 that should remain..like the main top bar with the status icons and such.&lt;br /&gt;
 Scrollbars are the main thing I can think of right now.&lt;br /&gt;
&lt;br /&gt;
===Handgesture recognition proposals===&lt;br /&gt;
&lt;br /&gt;
====Using simple, localized warp as modifier key====&lt;br /&gt;
&lt;br /&gt;
As discussed on community list:&lt;br /&gt;
&lt;br /&gt;
  If you hold down one finger and tap the other one, the mouse pops over and back&lt;br /&gt;
  again. If you keep your second finger touching, the cursor follows it. When you&lt;br /&gt;
  release it, cursor goes back to first finger position. This could be a way to&lt;br /&gt;
  set a bounding box or turn on the mode. So the second finger can do something&lt;br /&gt;
  like rotating around the first, or increase or lower the distance to the first.&lt;br /&gt;
&lt;br /&gt;
* the so-called &amp;quot;first touch&amp;quot; can be done on the mokowheel zone itself: put your left thumb on the black area; if you touch the screen with another finger, there is a '''warp'''; the warp is detectable and allows to enter &amp;quot;fake multi-touchscreen mode&amp;quot;&lt;br /&gt;
* afterwards,&lt;br /&gt;
     * slide your right-hand finger down, it scrolls up&lt;br /&gt;
     * slide your right-hand finger up, it scrolls down&lt;br /&gt;
     * slide it left, next page/item&lt;br /&gt;
     * slide it right, previous page/item&lt;br /&gt;
     * do a circle: rotation&lt;br /&gt;
     * narrow towards the black circle: zoom -&lt;br /&gt;
     * go away: zoom +&lt;br /&gt;
* if you had kept your first finger on the black quarter circle, you can continue issuing other gestures&lt;br /&gt;
&lt;br /&gt;
The advantages of using simple origin-driven cursor warping as double touch detection criteria is that:&lt;br /&gt;
* you don't have to use the wheel as button, which would slow things down and generate errors (false button presses)&lt;br /&gt;
* simpler detection algorithms that can pass by the fluctuation due to pressure relative distribution&lt;br /&gt;
* the space taken by the wheel itself is &amp;quot;useless&amp;quot; (i.e. displays no information); using it as modifier allows to keep the screen clean for reading&lt;br /&gt;
* the origin of this zone lets use maximum surface of the screen, allowing more fine controlling&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_rotate_right.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_previous.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_down.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_zoom-.png]]&lt;br /&gt;
&lt;br /&gt;
*Pros:&lt;br /&gt;
** who said we need multi-touch hardware?&lt;br /&gt;
** this may be the easiest way (in terms of design/implementation complexity, reliability)&lt;br /&gt;
*Cons: &lt;br /&gt;
** no matter what we'll invent, we'll need two hands for on-the-move controlling&lt;br /&gt;
** what about left-handed people?&lt;br /&gt;
&lt;br /&gt;
====What is to modify ?====&lt;br /&gt;
&lt;br /&gt;
We need to emulate key presses. We need to work at a layer where we can get raw cursor coordinates. &amp;lt;---- X server layer?&lt;br /&gt;
&lt;br /&gt;
There is a fake keyboard module (for dev purposes) in the main kernel tree, which could be used to simulate keyboard presses (hence keeping keyboard-enabled apps unmodified).&lt;br /&gt;
&lt;br /&gt;
====Full multi-touch emulation====&lt;br /&gt;
&lt;br /&gt;
Doable, but tricky...&lt;br /&gt;
&lt;br /&gt;
==Preparing the multi touch==&lt;br /&gt;
&lt;br /&gt;
One day we might get multitouch devices. Let's get ready.&lt;br /&gt;
&lt;br /&gt;
===MPX===&lt;br /&gt;
 	&lt;br /&gt;
The Multi-Pointer X Server is a modification of the X server to support multiple mice and keyboards in X. It provides users with one cursor per device and one keyboard focus per keyboard. Each cursor can operate independently. MPX is the first multicursor windowing system and allows two-handed interaction with legacy applications, but also the creation of innovative applications and user interfaces. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://wearables.unisa.edu.au/mpx/ The multipoint X server project]&lt;br /&gt;
&lt;br /&gt;
===MacSlow's Lowfat getting multitouched===&lt;br /&gt;
&lt;br /&gt;
http://dlai.jafu.dk/?p=1&lt;br /&gt;
&lt;br /&gt;
==Open questions==&lt;br /&gt;
&lt;br /&gt;
* will the neo/openmoko graphics system be powerful enough for such uses? I apple uses an OpenGL ES acceleration on this device (as well as on recent iPods), which is on the way with [[GTA02#.22Phase_2.22_.28GTA02.2C_.22Mass_Market.22.29|GTA02]].&lt;br /&gt;
* how does the touchscreen behave? We need a detailed touchscreen wiki information page, with visual traces. How hardware-specific is it?&lt;br /&gt;
* is multi touch really that awesome? I guess not.&lt;br /&gt;
&lt;br /&gt;
{{Languages|UI Improvements}}&lt;br /&gt;
&lt;br /&gt;
[[Category:User Interfaces| ]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/UI_Improvements</id>
		<title>UI Improvements</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/UI_Improvements"/>
				<updated>2007-07-27T17:04:26Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* What is to modify ? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
  Obviously the tools are in the wild to build interfaces that could rival&lt;br /&gt;
  (or better IMO) anything Apple comes up with. We just need to organize&lt;br /&gt;
  this stuff. This would need hardware that can support dynamic&lt;br /&gt;
  interfaces. I can help here, too.&lt;br /&gt;
  sean@openmoko.com&lt;br /&gt;
&lt;br /&gt;
In fact, this place shall be dedicated to human-machine interactions improvements discussion;&lt;br /&gt;
&lt;br /&gt;
Human-machine interaction can be separated into several aspects:&lt;br /&gt;
* the physical contact/input device: the mono-touch touchscreen&lt;br /&gt;
* the graphics: &lt;br /&gt;
** accelerated rendering can add more consistency to zooming user interfaces, which seem to be quite an interesting concept for embedded scrensize-limited devices&lt;br /&gt;
** adding physics &amp;quot;look and feel&amp;quot; to (ex: menu's) behaviours can add coherence too&lt;br /&gt;
* the input methods&lt;br /&gt;
** the virtual keyboard&lt;br /&gt;
** handgestures&lt;br /&gt;
&lt;br /&gt;
==Finding inspiration ...==&lt;br /&gt;
&lt;br /&gt;
===Seen Live===&lt;br /&gt;
&lt;br /&gt;
'''Multi-touch'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=89sz8ExZndc Multi-Touchscreen experiments video @youtube]&lt;br /&gt;
*[http://www.youtube.com/watch?v=nPqqfVLQ_qY iPhone UI features demo @youtube]&lt;br /&gt;
&lt;br /&gt;
'''Zooming user interfaces'''&lt;br /&gt;
*[http://www.zenzui.com/products.html ZenZui], a [http://en.wikipedia.org/wiki/ZUI ZUI (zooming user interface)]&lt;br /&gt;
*[http://labs.live.com/Deepfish/videos.aspx Microsoft Bluefish's ZUI] (new mobile webbrowser)&lt;br /&gt;
*[http://googlesystem.blogspot.com/2007/04/opera-920-more-homepages-at-your.html Opera speed dial]&lt;br /&gt;
&lt;br /&gt;
'''Graphics'''&lt;br /&gt;
*[http://www.rasterman.com/files/eem.avi EEM], Rasterman's EFL libs on handelds proof of concept (doesn't DO anything, just showing off the EFLs on a handeld)&lt;br /&gt;
*[http://www.youtube.com/watch?v=8kLFPfaxQ6U&amp;amp;eurl= Nvidia's cutting-edge techno], an [http://www.khronos.org/openkode/ Openkode] demo.&lt;br /&gt;
&lt;br /&gt;
'''Science fiction'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=G_FS2TiK3AI UPMC Future?]&lt;br /&gt;
&lt;br /&gt;
'''Links:'''&lt;br /&gt;
*[http://elevate.sourceforge.net/links.html elevate project's links] sums up quite greatly the latest innovations in the desktop area&lt;br /&gt;
*[http://nooface.net/ Nooface] is a human-machine news site&lt;br /&gt;
*Asus-Intel's [http://www.hothardware.com/articles/Hands_on_with_the_ASUS_Eee/?page=2 Eee]'s interface&lt;br /&gt;
&lt;br /&gt;
===Clever hacks===&lt;br /&gt;
&lt;br /&gt;
It's been said that having no multitouch screen allows less freedom for innovation. Maybe we could get something out of our touchscreen drivers.&lt;br /&gt;
&lt;br /&gt;
Why ? Think of apple's scroll up/down feature on macbooks touchpads (which '''aren't multi touch''', it's a [http://iscroll2.sourceforge.net/ clever driver hack, iscroll2]):&lt;br /&gt;
&lt;br /&gt;
  To scroll, just place two fingers on your trackpad instead of one. Both fingers&lt;br /&gt;
  need to be placed next to each other horizontally (not vertically, the trackpad &lt;br /&gt;
  cannot detect that). Some people get better results with their finger spaced a&lt;br /&gt;
  little bit apart, while others prefer having the fingers right next to each other.&lt;br /&gt;
&lt;br /&gt;
  iScroll2 provides two scrolling modes: Linear and circular scrolling.&lt;br /&gt;
&lt;br /&gt;
  For linear scrolling, move the two fingers up/down or left/right in a straight &lt;br /&gt;
  line, respectively, to scroll in that direction.&lt;br /&gt;
&lt;br /&gt;
  Circular scrolling works in a way similar to the iPod's scroll wheel: Move the two&lt;br /&gt;
  fingers in a circle to scroll up or down, depending   on whether you move in a &lt;br /&gt;
  clockwise or counterclockwise direction.&lt;br /&gt;
&lt;br /&gt;
Maybe we can port/adapt/get inspiration from this macintosh driver.&lt;br /&gt;
&lt;br /&gt;
===n-D navigation: the polyhedra inspiration===&lt;br /&gt;
&lt;br /&gt;
When we want to navigate files, mp3s in an mp3 player, etc... Every control that the application needs is a button. What about looking at the polyhedrons? We could find one for each usage, with as many surrounding subzones that may be used as controls. Ex: you need 5 buttons, let's take a pentagon with 5 surrounding zones all around. That way, it's always optimized...&lt;br /&gt;
&lt;br /&gt;
http://en.wikipedia.org/wiki/Polyhedra&lt;br /&gt;
http://en.wikipedia.org/wiki/List_of_uniform_polyhedra&lt;br /&gt;
&lt;br /&gt;
===Our weapons===&lt;br /&gt;
&lt;br /&gt;
We can't improve the human-machine interface without knowing the strengths / weaknesses of our hardware; some of the weaknesses might turn out as exploitable features, some strengths as limiting constraints.&lt;br /&gt;
&lt;br /&gt;
====The touchscreen====&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What exactly does the touchscreen see when  you touch the screen with 2 fingers&lt;br /&gt;
  at the same time, when you move them, when you move only one of the 2, etc. I'm &lt;br /&gt;
  also interested in knowing how precise the touchscreen is (ex: refresh rate, &lt;br /&gt;
  possible pressure indication, ...)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* The output is the center of the bounding box of the touched area&lt;br /&gt;
* The touch point skips instantly on double touch&lt;br /&gt;
* Pressure has almost no effect on a single touch, but not so on a double touch. The relative pressures will cause a significant skewing effect towards the harder touch. You can easily move the pointer along the line between your two fingers by changing the relative pressure.&lt;br /&gt;
&lt;br /&gt;
Conclusions:&lt;br /&gt;
* we can detect double touch as jumps, and that's all&lt;br /&gt;
* no pressure&lt;br /&gt;
* This could be an interesting input method for games - e.g. holding the Neo in landscape view, letting each thumb rest on a specific input area; probably needs to be checked for usability with a real device&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when sliding two fingers in parallel up(L,R)-&amp;gt;down(L,R)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see a slide along the center line between your two fingers. In practice, you can't keep the pressure equal, so you will see some kind of zig-zag line somewhere between the two pressure points in the direction of your slide.&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when narrowing two fingers in slide (=zoom effect on iphone)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see the pointer stay at the center of the zoom movement. In practice, you can't keep the pressure equal for both fingers, so the pointer will move towards one of the two pressure points.&lt;br /&gt;
&lt;br /&gt;
====Graphics and computational capabilities====&lt;br /&gt;
&lt;br /&gt;
It would be good to report what performance the current hardware allows:&lt;br /&gt;
* There was no pure X11 benchmarking done (AFAIK) (how many fps at full VGA scrolling, ex: 1024*480 image scrolling?)&lt;br /&gt;
* what about the lcd reactivity? What if we don't see anything but blur while moving items fast?&lt;br /&gt;
&lt;br /&gt;
Please report here your impressions.&lt;br /&gt;
&lt;br /&gt;
==Areas of improvement==&lt;br /&gt;
&lt;br /&gt;
* OpenGL for fluid zooming interfaces (2D: the infinite sphere model, 1D: the infinite wheel of fortune/ribbon model, exposé)&lt;br /&gt;
* HandGestures&lt;br /&gt;
* Physics-model based improvements: inertia and friction&lt;br /&gt;
* multi touch screen for natural handgestures &lt;br /&gt;
* improved virtual keyboard&lt;br /&gt;
* switching to another GUI toolkit (EFLs)&lt;br /&gt;
&lt;br /&gt;
===Physics-inspired animation a.k.a. &amp;quot;Digital Physics&amp;quot;===&lt;br /&gt;
&lt;br /&gt;
If we want to add eye candy &amp;amp; usability to the UI (such as smooth realistic list scrolling, as seen in apple's&lt;br /&gt;
iphone demo on contacts lists for instance), we'll need a physics engine, so that moves &amp;amp; animations aren't all linear.&lt;br /&gt;
&lt;br /&gt;
The following aticle explains the [http://www.readwriteweb.com/archives/the_physics_of_iphone.php Digital Physics] term from the iPhone example.&lt;br /&gt;
&lt;br /&gt;
The most used technique for calculating trajectories and systems of related geometrical objects seems to be [http://en.wikipedia.org/wiki/Verlet_integration verlet integration] implementation; it is an alternative to Euler's integration method, using fast approximation. &lt;br /&gt;
&lt;br /&gt;
We may have no need for such a mathematical method at first, but perhaps there are other use cases. For instance, it may be useful to gesture recognition (i'm not aware if existing gesture recognition engines measure speed, acceleration...).&lt;br /&gt;
&lt;br /&gt;
====Open Dynamics Engine====&lt;br /&gt;
&lt;br /&gt;
ODE is an open source, high performance library for simulating rigid body dynamics. It is fully featured, stable, mature and platform independent with an easy to use C/C++ API. It has advanced joint types and integrated collision detection with friction. ODE is useful for simulating vehicles, objects in virtual reality environments and virtual creatures. It is currently used in many computer games, 3D authoring tools and simulation tools.&lt;br /&gt;
&lt;br /&gt;
http://www.ode.org/&lt;br /&gt;
&lt;br /&gt;
====Libakamaru====&lt;br /&gt;
&lt;br /&gt;
The [http://people.freedesktop.org/~krh/akamaru.git/ akamaru library] is the code behind [http://www.youtube.com/watch?v=VekgyKQoTeM kiba dock]'s fun and dynamic behaviour. It's dependencies are light (needs just GLib). It takes elasticity, friction, gravity into account.&lt;br /&gt;
&lt;br /&gt;
If you want to take a quick look at the code:&lt;br /&gt;
svn co http://svn.kiba-dock.org/akamaru/ akamaru&lt;br /&gt;
&lt;br /&gt;
The only (AFAIK) application using this library is kiba-dock, a *fun* app launcher, but we may find another use to it in the future.&lt;br /&gt;
&lt;br /&gt;
As suggested on the mailing list, it is mostly overkill for the uses we intend to have, but this library may be optimized already, the API can spare some time for too. Furthermore, ''Qui peut le plus, peut le moins''.&lt;br /&gt;
&lt;br /&gt;
====Verlet integration implementation from e17====&lt;br /&gt;
&lt;br /&gt;
There's an undergoing verlet integration implementation into the e17 project (by rephorm) see http://rephorm.com/news/tag/physics , so we may see some UI physics integration into e17 someday.&lt;br /&gt;
&lt;br /&gt;
====Robert Pernner's easy equations====&lt;br /&gt;
&lt;br /&gt;
http://www.robertpenner.com/easing/&lt;br /&gt;
&lt;br /&gt;
See the demo: implements non linear behaviour (actionscript), but may give inspiration&lt;br /&gt;
&lt;br /&gt;
===Extending the touchscreen capabilities and input methods===&lt;br /&gt;
&lt;br /&gt;
* '''Multitouchscreen emulation'''&lt;br /&gt;
&lt;br /&gt;
If we got it right, when touching the screen on a second place, the cursor oscillates between the two points depending on relative pressure distribution. Using averaging algorithms, we may have the opportunity to detect peculiar behaviours.&lt;br /&gt;
&lt;br /&gt;
We need raw data (x,y,t) from the real hardware for the following behaviours:&lt;br /&gt;
* slide two fingers in parallel - vertical up/down (scroll)&lt;br /&gt;
* turn the two fingers around (rotate)&lt;br /&gt;
* slide two fingers towards each other (zoom-)&lt;br /&gt;
* slide two fingers apart (zoom+)&lt;br /&gt;
&lt;br /&gt;
When touching the screen with two fingers at the same time, we necessarily see the two points, or are able to extrapolate the position of the second one. This solution can add feature, but will probably be little erratic...&lt;br /&gt;
&lt;br /&gt;
* '''Touchscreen kernel module hacking'''&lt;br /&gt;
&lt;br /&gt;
We may correct the &amp;quot;half distance&amp;quot; phenomenon on double touch: if double touch is detected, then assimilate the cursor as twice further than the first touch. It would allow finer control, but higher instability.&lt;br /&gt;
&lt;br /&gt;
The double touch detection may be implemented in the driver itself, as well as stabilization.&lt;br /&gt;
&lt;br /&gt;
* '''Other detectable behaviours'''&lt;br /&gt;
&lt;br /&gt;
The warping can be used in the 4 diagonals, plus the up/down/right/left cross:&lt;br /&gt;
&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
  - 1            -  - 1          2 -  - 1            -  -      2       -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -             2-  -              -  - 2            -  -      1       -&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
&lt;br /&gt;
It's not double touch, but two sequential presses with a short time in between (~0.5 s)&lt;br /&gt;
&lt;br /&gt;
===Improved virtual keyboard===&lt;br /&gt;
&lt;br /&gt;
One nice idea for virtual input is [http://www.micropp.se/openmoko/ finger-splash]&lt;br /&gt;
&lt;br /&gt;
Yet, optimization does not only apply to the plain one-letter-at-a-time input. We need some sort of T9 (dictionary-based input help). When typing a word, the first letter determines the next possible ones. Therefore, we may let disappear the less-probable following letters. Ex: type an L, there's no way an X follows...&lt;br /&gt;
&lt;br /&gt;
Hints: &lt;br /&gt;
* ZIP's huffmann compression applied to SMSs/mails for detecting the most used characters/words/sentences.&lt;br /&gt;
* html tag-clouds, one-letter tag clouds ; font size proportional to the probability of being used&lt;br /&gt;
&lt;br /&gt;
The most critical point is the initial disposition of the letters, before any letter is typed. We may also want to use horizontal two-parts keyboard (with the neo in hands like a psp..)&lt;br /&gt;
&lt;br /&gt;
The [http://www.strout.net/info/ideas/hexinput.html hexinput] concept is interesting. What about hiding the less probable letters and increasing the remaining ones during typing?&lt;br /&gt;
&lt;br /&gt;
===Towards OpenGL compositing===&lt;br /&gt;
&lt;br /&gt;
There are [http://www.hbmobile.org/wiki/index.php?title=GUI_Frameworks lots of possible GUI frameworks] with various software architectures that could be used for OpenMoko.&lt;br /&gt;
&lt;br /&gt;
GTA01 hardware uses GTK+/matchbox without hardware acceleration, and it's not enough: this is a first that a mobile Linux device has such a high DPI resolution. OpenGL ES compositing seems to have a bright future on embedded devices, because compositing seems to give natural zooming interfaces reality (at last!).&lt;br /&gt;
&lt;br /&gt;
Considering recent changes in destkop applications, opengl has a definite future. For instance, the expose (be it apple's or beryl's) is a very interesting and usable feature. Using compositing allows the physics metaphore: '''the human brain doesn't like &amp;quot;gaps&amp;quot;/jumps (for instance while scrolling a text), it needs continuity''', which can be provided by opengl. When you look at apple's iphone prototype, it's not just eye candy, it's maybe the most natural/human way of navigating, because it's sufficiently realistic for the brain to forget the non-physical nature of what's inside.&lt;br /&gt;
&lt;br /&gt;
So, opengl hardware will be needed in a more or less distant hardware, for 100% fluid operation. Benchmarking will be needed to compare the different alternatives that are cited further.&lt;br /&gt;
&lt;br /&gt;
====Switching to the Enlightenment Foundation Libraries====&lt;br /&gt;
&lt;br /&gt;
Evas is a powerful and power sparing canvas drawing library. It can be OpenGL accelerated. Python/Ruby bindings are available in the &amp;quot;proto&amp;quot; e17 cvs folder.&lt;br /&gt;
&lt;br /&gt;
''Moved [[E17|here]]''&lt;br /&gt;
&lt;br /&gt;
====Clutter Toolkit====&lt;br /&gt;
&lt;br /&gt;
Clutter, an [http://o-hand.com/ OpenedHand] project, is an open source software library for creating fast, visually rich graphical user interfaces. The most obvious example of potential usage is in media center type applications.&lt;br /&gt;
&lt;br /&gt;
http://clutter-project.org/&lt;br /&gt;
&lt;br /&gt;
Clutter uses OpenGL (and optionally '''OpenGL ES''') for rendering but with an API which hides the underlying GL complexity from the developer. The Clutter API is intended to be easy to use, efficient and flexible.&lt;br /&gt;
&lt;br /&gt;
It does integrate gstreamer (for easy media playback, even camera or mic inputs), allows pango text rendering, cairo graphics rendering. Provided bindings are python, C# and Ruby.&lt;br /&gt;
&lt;br /&gt;
GTK off screen rendering is supposed to be on it's way; once it is here, there will be a possibility of using GTK apps directly within OpenGL apps as textures, which would lead to the possibility of creating a full OpenGL &amp;quot;application manager&amp;quot; (as well as media consuming app) with ZUI features.&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C, OpenGL&lt;br /&gt;
* Bindings: Python, C#, Ruby&lt;br /&gt;
* Backends: GLX / SDL / EGL&lt;br /&gt;
* Media support: Gstreamer integration, Cairo graphics rendering, Pango fonts rendering&lt;br /&gt;
* Embedding: GTK embedding&lt;br /&gt;
&lt;br /&gt;
====Graff====&lt;br /&gt;
&lt;br /&gt;
An early demonstration of Graff, which ''is a lighweight high-performance graphics rendering library.''&lt;br /&gt;
http://www.mdk.org.pl/articles/2007/04/23/chapter-1-in-which-we-meet-graff&lt;br /&gt;
&lt;br /&gt;
Be sure to check out this demo (scrolling list with inertia scrolling)&lt;br /&gt;
http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Of course it will remind you of Apple iPhone's UI. But this one runs in software mode on Nokia N770&amp;amp;800 already. The most notable part of Graff seems to be the inertia and physics integration in general.&lt;br /&gt;
&lt;br /&gt;
====Pigment API====&lt;br /&gt;
&lt;br /&gt;
Fluendo's (the Gstreamer guys) ''[https://core.fluendo.com/pigment/trac Pigment] is a Python library designed to easily build user interfaces with embedded multimedia. Its design allows to use it on several platforms, thanks to a plugin system allowing to choose the underlying graphical API. Pigment is the rendering engine of Elisa, the Fluendo Media Center project.''&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C OpenGL&lt;br /&gt;
* Bindings: Python&lt;br /&gt;
* Backends: DirectFB OpenGL&lt;br /&gt;
* Media playback integration: using Gstreamer&lt;br /&gt;
&lt;br /&gt;
===Choosing===&lt;br /&gt;
&lt;br /&gt;
Benchmarking will be needed. We have therefore to define a std testing application that would allow to compare alternatives. &lt;br /&gt;
&lt;br /&gt;
Some Clutter VS Pigment information: http://www.taimila.com/?q=node/14&lt;br /&gt;
&lt;br /&gt;
==Improvement ideas==&lt;br /&gt;
&lt;br /&gt;
Please add here any idea that seems of relevance.&lt;br /&gt;
&lt;br /&gt;
===1D list scrolling: looped physics-driven item list===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
&lt;br /&gt;
[EDIT] Graff's inertia scrolling list example: http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Take an item list (ex: adress book), print it on a ribbon of paper, and glue it on a wheel (on the tire). You're looking in the front of it, so when you want to go from the A to Z, you touch the wheel and drag it up. When you let the wheel go, it goes furter, taken by it's inertia. Stop the wheel when you got your contact. Got the idea? That's why we may speak of an &amp;quot;infinite wheel&amp;quot;, so that the surface is flat. For our case here, we always want to display square content, so the [http://en.wikipedia.org/wiki/Uniform_prism n-sided uniform prism] analogy is mathematically more exact.&lt;br /&gt;
&lt;br /&gt;
Important features:&lt;br /&gt;
* '''weight''': the biggest the item list, the faster it scrolls; that way, you don't have to wait too long for big lists, and you don't miss your item on shorter lists&lt;br /&gt;
* '''friction''': there is friction where the wheel is fixed, so that the wheel doesn't turn infinitely; more friction on short lists, less on big ones&lt;br /&gt;
* the '''initial speed and acceleration vector''' you give it determines it's futher rotation&lt;br /&gt;
* it's &amp;quot;round&amp;quot;/cyclic, so you can '''browse the list in two directions'''&lt;br /&gt;
* we may want to add a &amp;quot;progression indicator&amp;quot;, ex the current alphabetical letter, with a font size adequate to the proportion of the number of entries in the letter subcategory, or a reduced map of the distribution of the first letters...&lt;br /&gt;
 &lt;br /&gt;
We can add &amp;quot;parallel wheels&amp;quot;, symbolizing different sorting methods. Slide long to the left / right to look at a different wheel = items organization.&lt;br /&gt;
&lt;br /&gt;
====Controls====&lt;br /&gt;
&lt;br /&gt;
* Sliding up/down = Single click + maintained for a minimal distance&lt;br /&gt;
&lt;br /&gt;
Effect: scroll in an inverted/negated fashion (slide down = scroll up, slide up = scroll down)&lt;br /&gt;
&lt;br /&gt;
When finger is released (i.e. touchscreen doesn't detect any press):&lt;br /&gt;
  if (last_speed_seen &amp;gt; 0 ) then keep this speed and acceleration, with friction&lt;br /&gt;
  else stop scrolling&lt;br /&gt;
&lt;br /&gt;
Scrolling here is seen as unidimensional, but can apply to bidimensional situations (ex: zoomed image) too&lt;br /&gt;
&lt;br /&gt;
* Action = quick double tap&lt;br /&gt;
&lt;br /&gt;
* Details/select = short single tap&lt;br /&gt;
&lt;br /&gt;
* Right click = long tap&lt;br /&gt;
&lt;br /&gt;
* Sliding left/right: switch sorting method&lt;br /&gt;
&lt;br /&gt;
====Parts to modify====&lt;br /&gt;
&lt;br /&gt;
''Having a scroll that isn't a 1:1 map to the user's action isn't hard. It's just an extra calculation in the scroll code.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;---- Where is the scroll code? :)&lt;br /&gt;
&lt;br /&gt;
* libmokoui&lt;br /&gt;
** [[Stylus_Scrolling | Stylus scrolling widget]]&lt;br /&gt;
** [[Finger_Scrolling | Finger scrolling wheel widget]]&lt;br /&gt;
* gtk&lt;br /&gt;
** [http://www.gtk.org/api/2.6/gtk/GtkVScrollbar.html GtkVScrollbar]&lt;br /&gt;
&lt;br /&gt;
The best would be to add the feature for both finger and stylus scrolling.&lt;br /&gt;
&lt;br /&gt;
TODO:&lt;br /&gt;
* make the entire list a &amp;quot;scrolling zone&amp;quot;, i.e. an overlay transparent scrolling widget?&lt;br /&gt;
* define controls&lt;br /&gt;
* add the inertia feature&lt;br /&gt;
&lt;br /&gt;
===1D Scrolling: inertia friction integration into openmoko's finger wheel=== &lt;br /&gt;
&lt;br /&gt;
The same, but for the wheel. It can be very short to do: you don't have 1:1 anymore, but, for example, 1/4 wheel turn = 1 item. It's demultiplicated, but has inertia.&lt;br /&gt;
&lt;br /&gt;
===Left-handed UI Support===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
A discussion on the community list identified a desire to have the ability to switch the OpenMoko UI into &amp;quot;left-handed&amp;quot; mode.  &lt;br /&gt;
&lt;br /&gt;
 The main problem is scrollbars, when they're on the right, dragging  &lt;br /&gt;
 the scrollbar left handed results in your hand covering the screen so  &lt;br /&gt;
 you can't see what you are doing. So having the option of scrollbars  &lt;br /&gt;
 on the left would be useful.&lt;br /&gt;
&lt;br /&gt;
 I don't think the whole screen should be mirrored! There are some elements&lt;br /&gt;
 that should remain..like the main top bar with the status icons and such.&lt;br /&gt;
 Scrollbars are the main thing I can think of right now.&lt;br /&gt;
&lt;br /&gt;
===Handgesture recognition proposals===&lt;br /&gt;
&lt;br /&gt;
====Using simple, localized warp as modifier key====&lt;br /&gt;
&lt;br /&gt;
As discussed on community list:&lt;br /&gt;
&lt;br /&gt;
  If you hold down one finger and tap the other one, the mouse pops over and back&lt;br /&gt;
  again. If you keep your second finger touching, the cursor follows it. When you&lt;br /&gt;
  release it, cursor goes back to first finger position. This could be a way to&lt;br /&gt;
  set a bounding box or turn on the mode. So the second finger can do something&lt;br /&gt;
  like rotating around the first, or increase or lower the distance to the first.&lt;br /&gt;
&lt;br /&gt;
* the so-called &amp;quot;first touch&amp;quot; can be done on the mokowheel zone itself: put your left thumb on the black area; if you touch the screen with another finger, there is a '''warp'''; the warp is detectable and allows to enter &amp;quot;fake multi-touchscreen mode&amp;quot;&lt;br /&gt;
* afterwards,&lt;br /&gt;
     * slide your right-hand finger down, it scrolls up&lt;br /&gt;
     * slide your right-hand finger up, it scrolls down&lt;br /&gt;
     * slide it left, next page/item&lt;br /&gt;
     * slide it right, previous page/item&lt;br /&gt;
     * do a circle: rotation&lt;br /&gt;
     * narrow towards the black circle: zoom -&lt;br /&gt;
     * go away: zoom +&lt;br /&gt;
* if you had kept your first finger on the black quarter circle, you can continue issuing other gestures&lt;br /&gt;
&lt;br /&gt;
The advantages of using simple origin-driven cursor warping as double touch detection criteria is that:&lt;br /&gt;
* you don't have to use the wheel as button, which would slow things down and generate errors (false button presses)&lt;br /&gt;
* simpler detection algorithms that can pass by the fluctuation due to pressure relative distribution&lt;br /&gt;
* the space taken by the wheel itself is &amp;quot;useless&amp;quot; (i.e. displays no information); using it as modifier allows to keep the screen clean for reading&lt;br /&gt;
* the origin of this zone lets use maximum surface of the screen, allowing more fine controlling&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_rotate_right.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_previous.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_down.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_zoom-.png]]&lt;br /&gt;
&lt;br /&gt;
*Pros:&lt;br /&gt;
** who said we need multi-touch hardware?&lt;br /&gt;
** this may be the easiest way (in terms of design/implementation complexity, reliability)&lt;br /&gt;
*Cons: &lt;br /&gt;
** no matter what we'll invent, we'll need two hands for on-the-move controlling&lt;br /&gt;
** what about left-handed people?&lt;br /&gt;
&lt;br /&gt;
====What is to modify ?====&lt;br /&gt;
&lt;br /&gt;
We need to emulate key presses. We need to work at a layer where we can get raw cursor coordinates. &amp;lt;---- X server layer?&lt;br /&gt;
&lt;br /&gt;
There is a fake keyboard module (for dev purposes) in the main kernel tree, which could be used to simulate keyboard presses (hence keeping keyboard-enabled apps unmodified).&lt;br /&gt;
&lt;br /&gt;
====Full multi-touch emulation====&lt;br /&gt;
&lt;br /&gt;
Doable, but tricky...&lt;br /&gt;
&lt;br /&gt;
==Open questions==&lt;br /&gt;
&lt;br /&gt;
* will the neo/openmoko graphics system be powerful enough for such uses? I apple uses an OpenGL ES acceleration on this device (as well as on recent iPods), which is on the way with [[GTA02#.22Phase_2.22_.28GTA02.2C_.22Mass_Market.22.29|GTA02]].&lt;br /&gt;
* how does the touchscreen behave? We need a detailed touchscreen wiki information page, with visual traces. How hardware-specific is it?&lt;br /&gt;
* is multi touch really that awesome? I guess not.&lt;br /&gt;
&lt;br /&gt;
{{Languages|UI Improvements}}&lt;br /&gt;
&lt;br /&gt;
[[Category:User Interfaces| ]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/UI_Improvements</id>
		<title>UI Improvements</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/UI_Improvements"/>
				<updated>2007-07-27T17:01:51Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: Added reference to graff's scrolling list&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
  Obviously the tools are in the wild to build interfaces that could rival&lt;br /&gt;
  (or better IMO) anything Apple comes up with. We just need to organize&lt;br /&gt;
  this stuff. This would need hardware that can support dynamic&lt;br /&gt;
  interfaces. I can help here, too.&lt;br /&gt;
  sean@openmoko.com&lt;br /&gt;
&lt;br /&gt;
In fact, this place shall be dedicated to human-machine interactions improvements discussion;&lt;br /&gt;
&lt;br /&gt;
Human-machine interaction can be separated into several aspects:&lt;br /&gt;
* the physical contact/input device: the mono-touch touchscreen&lt;br /&gt;
* the graphics: &lt;br /&gt;
** accelerated rendering can add more consistency to zooming user interfaces, which seem to be quite an interesting concept for embedded scrensize-limited devices&lt;br /&gt;
** adding physics &amp;quot;look and feel&amp;quot; to (ex: menu's) behaviours can add coherence too&lt;br /&gt;
* the input methods&lt;br /&gt;
** the virtual keyboard&lt;br /&gt;
** handgestures&lt;br /&gt;
&lt;br /&gt;
==Finding inspiration ...==&lt;br /&gt;
&lt;br /&gt;
===Seen Live===&lt;br /&gt;
&lt;br /&gt;
'''Multi-touch'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=89sz8ExZndc Multi-Touchscreen experiments video @youtube]&lt;br /&gt;
*[http://www.youtube.com/watch?v=nPqqfVLQ_qY iPhone UI features demo @youtube]&lt;br /&gt;
&lt;br /&gt;
'''Zooming user interfaces'''&lt;br /&gt;
*[http://www.zenzui.com/products.html ZenZui], a [http://en.wikipedia.org/wiki/ZUI ZUI (zooming user interface)]&lt;br /&gt;
*[http://labs.live.com/Deepfish/videos.aspx Microsoft Bluefish's ZUI] (new mobile webbrowser)&lt;br /&gt;
*[http://googlesystem.blogspot.com/2007/04/opera-920-more-homepages-at-your.html Opera speed dial]&lt;br /&gt;
&lt;br /&gt;
'''Graphics'''&lt;br /&gt;
*[http://www.rasterman.com/files/eem.avi EEM], Rasterman's EFL libs on handelds proof of concept (doesn't DO anything, just showing off the EFLs on a handeld)&lt;br /&gt;
*[http://www.youtube.com/watch?v=8kLFPfaxQ6U&amp;amp;eurl= Nvidia's cutting-edge techno], an [http://www.khronos.org/openkode/ Openkode] demo.&lt;br /&gt;
&lt;br /&gt;
'''Science fiction'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=G_FS2TiK3AI UPMC Future?]&lt;br /&gt;
&lt;br /&gt;
'''Links:'''&lt;br /&gt;
*[http://elevate.sourceforge.net/links.html elevate project's links] sums up quite greatly the latest innovations in the desktop area&lt;br /&gt;
*[http://nooface.net/ Nooface] is a human-machine news site&lt;br /&gt;
*Asus-Intel's [http://www.hothardware.com/articles/Hands_on_with_the_ASUS_Eee/?page=2 Eee]'s interface&lt;br /&gt;
&lt;br /&gt;
===Clever hacks===&lt;br /&gt;
&lt;br /&gt;
It's been said that having no multitouch screen allows less freedom for innovation. Maybe we could get something out of our touchscreen drivers.&lt;br /&gt;
&lt;br /&gt;
Why ? Think of apple's scroll up/down feature on macbooks touchpads (which '''aren't multi touch''', it's a [http://iscroll2.sourceforge.net/ clever driver hack, iscroll2]):&lt;br /&gt;
&lt;br /&gt;
  To scroll, just place two fingers on your trackpad instead of one. Both fingers&lt;br /&gt;
  need to be placed next to each other horizontally (not vertically, the trackpad &lt;br /&gt;
  cannot detect that). Some people get better results with their finger spaced a&lt;br /&gt;
  little bit apart, while others prefer having the fingers right next to each other.&lt;br /&gt;
&lt;br /&gt;
  iScroll2 provides two scrolling modes: Linear and circular scrolling.&lt;br /&gt;
&lt;br /&gt;
  For linear scrolling, move the two fingers up/down or left/right in a straight &lt;br /&gt;
  line, respectively, to scroll in that direction.&lt;br /&gt;
&lt;br /&gt;
  Circular scrolling works in a way similar to the iPod's scroll wheel: Move the two&lt;br /&gt;
  fingers in a circle to scroll up or down, depending   on whether you move in a &lt;br /&gt;
  clockwise or counterclockwise direction.&lt;br /&gt;
&lt;br /&gt;
Maybe we can port/adapt/get inspiration from this macintosh driver.&lt;br /&gt;
&lt;br /&gt;
===n-D navigation: the polyhedra inspiration===&lt;br /&gt;
&lt;br /&gt;
When we want to navigate files, mp3s in an mp3 player, etc... Every control that the application needs is a button. What about looking at the polyhedrons? We could find one for each usage, with as many surrounding subzones that may be used as controls. Ex: you need 5 buttons, let's take a pentagon with 5 surrounding zones all around. That way, it's always optimized...&lt;br /&gt;
&lt;br /&gt;
http://en.wikipedia.org/wiki/Polyhedra&lt;br /&gt;
http://en.wikipedia.org/wiki/List_of_uniform_polyhedra&lt;br /&gt;
&lt;br /&gt;
===Our weapons===&lt;br /&gt;
&lt;br /&gt;
We can't improve the human-machine interface without knowing the strengths / weaknesses of our hardware; some of the weaknesses might turn out as exploitable features, some strengths as limiting constraints.&lt;br /&gt;
&lt;br /&gt;
====The touchscreen====&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What exactly does the touchscreen see when  you touch the screen with 2 fingers&lt;br /&gt;
  at the same time, when you move them, when you move only one of the 2, etc. I'm &lt;br /&gt;
  also interested in knowing how precise the touchscreen is (ex: refresh rate, &lt;br /&gt;
  possible pressure indication, ...)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* The output is the center of the bounding box of the touched area&lt;br /&gt;
* The touch point skips instantly on double touch&lt;br /&gt;
* Pressure has almost no effect on a single touch, but not so on a double touch. The relative pressures will cause a significant skewing effect towards the harder touch. You can easily move the pointer along the line between your two fingers by changing the relative pressure.&lt;br /&gt;
&lt;br /&gt;
Conclusions:&lt;br /&gt;
* we can detect double touch as jumps, and that's all&lt;br /&gt;
* no pressure&lt;br /&gt;
* This could be an interesting input method for games - e.g. holding the Neo in landscape view, letting each thumb rest on a specific input area; probably needs to be checked for usability with a real device&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when sliding two fingers in parallel up(L,R)-&amp;gt;down(L,R)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see a slide along the center line between your two fingers. In practice, you can't keep the pressure equal, so you will see some kind of zig-zag line somewhere between the two pressure points in the direction of your slide.&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when narrowing two fingers in slide (=zoom effect on iphone)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see the pointer stay at the center of the zoom movement. In practice, you can't keep the pressure equal for both fingers, so the pointer will move towards one of the two pressure points.&lt;br /&gt;
&lt;br /&gt;
====Graphics and computational capabilities====&lt;br /&gt;
&lt;br /&gt;
It would be good to report what performance the current hardware allows:&lt;br /&gt;
* There was no pure X11 benchmarking done (AFAIK) (how many fps at full VGA scrolling, ex: 1024*480 image scrolling?)&lt;br /&gt;
* what about the lcd reactivity? What if we don't see anything but blur while moving items fast?&lt;br /&gt;
&lt;br /&gt;
Please report here your impressions.&lt;br /&gt;
&lt;br /&gt;
==Areas of improvement==&lt;br /&gt;
&lt;br /&gt;
* OpenGL for fluid zooming interfaces (2D: the infinite sphere model, 1D: the infinite wheel of fortune/ribbon model, exposé)&lt;br /&gt;
* HandGestures&lt;br /&gt;
* Physics-model based improvements: inertia and friction&lt;br /&gt;
* multi touch screen for natural handgestures &lt;br /&gt;
* improved virtual keyboard&lt;br /&gt;
* switching to another GUI toolkit (EFLs)&lt;br /&gt;
&lt;br /&gt;
===Physics-inspired animation a.k.a. &amp;quot;Digital Physics&amp;quot;===&lt;br /&gt;
&lt;br /&gt;
If we want to add eye candy &amp;amp; usability to the UI (such as smooth realistic list scrolling, as seen in apple's&lt;br /&gt;
iphone demo on contacts lists for instance), we'll need a physics engine, so that moves &amp;amp; animations aren't all linear.&lt;br /&gt;
&lt;br /&gt;
The following aticle explains the [http://www.readwriteweb.com/archives/the_physics_of_iphone.php Digital Physics] term from the iPhone example.&lt;br /&gt;
&lt;br /&gt;
The most used technique for calculating trajectories and systems of related geometrical objects seems to be [http://en.wikipedia.org/wiki/Verlet_integration verlet integration] implementation; it is an alternative to Euler's integration method, using fast approximation. &lt;br /&gt;
&lt;br /&gt;
We may have no need for such a mathematical method at first, but perhaps there are other use cases. For instance, it may be useful to gesture recognition (i'm not aware if existing gesture recognition engines measure speed, acceleration...).&lt;br /&gt;
&lt;br /&gt;
====Open Dynamics Engine====&lt;br /&gt;
&lt;br /&gt;
ODE is an open source, high performance library for simulating rigid body dynamics. It is fully featured, stable, mature and platform independent with an easy to use C/C++ API. It has advanced joint types and integrated collision detection with friction. ODE is useful for simulating vehicles, objects in virtual reality environments and virtual creatures. It is currently used in many computer games, 3D authoring tools and simulation tools.&lt;br /&gt;
&lt;br /&gt;
http://www.ode.org/&lt;br /&gt;
&lt;br /&gt;
====Libakamaru====&lt;br /&gt;
&lt;br /&gt;
The [http://people.freedesktop.org/~krh/akamaru.git/ akamaru library] is the code behind [http://www.youtube.com/watch?v=VekgyKQoTeM kiba dock]'s fun and dynamic behaviour. It's dependencies are light (needs just GLib). It takes elasticity, friction, gravity into account.&lt;br /&gt;
&lt;br /&gt;
If you want to take a quick look at the code:&lt;br /&gt;
svn co http://svn.kiba-dock.org/akamaru/ akamaru&lt;br /&gt;
&lt;br /&gt;
The only (AFAIK) application using this library is kiba-dock, a *fun* app launcher, but we may find another use to it in the future.&lt;br /&gt;
&lt;br /&gt;
As suggested on the mailing list, it is mostly overkill for the uses we intend to have, but this library may be optimized already, the API can spare some time for too. Furthermore, ''Qui peut le plus, peut le moins''.&lt;br /&gt;
&lt;br /&gt;
====Verlet integration implementation from e17====&lt;br /&gt;
&lt;br /&gt;
There's an undergoing verlet integration implementation into the e17 project (by rephorm) see http://rephorm.com/news/tag/physics , so we may see some UI physics integration into e17 someday.&lt;br /&gt;
&lt;br /&gt;
====Robert Pernner's easy equations====&lt;br /&gt;
&lt;br /&gt;
http://www.robertpenner.com/easing/&lt;br /&gt;
&lt;br /&gt;
See the demo: implements non linear behaviour (actionscript), but may give inspiration&lt;br /&gt;
&lt;br /&gt;
===Extending the touchscreen capabilities and input methods===&lt;br /&gt;
&lt;br /&gt;
* '''Multitouchscreen emulation'''&lt;br /&gt;
&lt;br /&gt;
If we got it right, when touching the screen on a second place, the cursor oscillates between the two points depending on relative pressure distribution. Using averaging algorithms, we may have the opportunity to detect peculiar behaviours.&lt;br /&gt;
&lt;br /&gt;
We need raw data (x,y,t) from the real hardware for the following behaviours:&lt;br /&gt;
* slide two fingers in parallel - vertical up/down (scroll)&lt;br /&gt;
* turn the two fingers around (rotate)&lt;br /&gt;
* slide two fingers towards each other (zoom-)&lt;br /&gt;
* slide two fingers apart (zoom+)&lt;br /&gt;
&lt;br /&gt;
When touching the screen with two fingers at the same time, we necessarily see the two points, or are able to extrapolate the position of the second one. This solution can add feature, but will probably be little erratic...&lt;br /&gt;
&lt;br /&gt;
* '''Touchscreen kernel module hacking'''&lt;br /&gt;
&lt;br /&gt;
We may correct the &amp;quot;half distance&amp;quot; phenomenon on double touch: if double touch is detected, then assimilate the cursor as twice further than the first touch. It would allow finer control, but higher instability.&lt;br /&gt;
&lt;br /&gt;
The double touch detection may be implemented in the driver itself, as well as stabilization.&lt;br /&gt;
&lt;br /&gt;
* '''Other detectable behaviours'''&lt;br /&gt;
&lt;br /&gt;
The warping can be used in the 4 diagonals, plus the up/down/right/left cross:&lt;br /&gt;
&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
  - 1            -  - 1          2 -  - 1            -  -      2       -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -             2-  -              -  - 2            -  -      1       -&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
&lt;br /&gt;
It's not double touch, but two sequential presses with a short time in between (~0.5 s)&lt;br /&gt;
&lt;br /&gt;
===Improved virtual keyboard===&lt;br /&gt;
&lt;br /&gt;
One nice idea for virtual input is [http://www.micropp.se/openmoko/ finger-splash]&lt;br /&gt;
&lt;br /&gt;
Yet, optimization does not only apply to the plain one-letter-at-a-time input. We need some sort of T9 (dictionary-based input help). When typing a word, the first letter determines the next possible ones. Therefore, we may let disappear the less-probable following letters. Ex: type an L, there's no way an X follows...&lt;br /&gt;
&lt;br /&gt;
Hints: &lt;br /&gt;
* ZIP's huffmann compression applied to SMSs/mails for detecting the most used characters/words/sentences.&lt;br /&gt;
* html tag-clouds, one-letter tag clouds ; font size proportional to the probability of being used&lt;br /&gt;
&lt;br /&gt;
The most critical point is the initial disposition of the letters, before any letter is typed. We may also want to use horizontal two-parts keyboard (with the neo in hands like a psp..)&lt;br /&gt;
&lt;br /&gt;
The [http://www.strout.net/info/ideas/hexinput.html hexinput] concept is interesting. What about hiding the less probable letters and increasing the remaining ones during typing?&lt;br /&gt;
&lt;br /&gt;
===Towards OpenGL compositing===&lt;br /&gt;
&lt;br /&gt;
There are [http://www.hbmobile.org/wiki/index.php?title=GUI_Frameworks lots of possible GUI frameworks] with various software architectures that could be used for OpenMoko.&lt;br /&gt;
&lt;br /&gt;
GTA01 hardware uses GTK+/matchbox without hardware acceleration, and it's not enough: this is a first that a mobile Linux device has such a high DPI resolution. OpenGL ES compositing seems to have a bright future on embedded devices, because compositing seems to give natural zooming interfaces reality (at last!).&lt;br /&gt;
&lt;br /&gt;
Considering recent changes in destkop applications, opengl has a definite future. For instance, the expose (be it apple's or beryl's) is a very interesting and usable feature. Using compositing allows the physics metaphore: '''the human brain doesn't like &amp;quot;gaps&amp;quot;/jumps (for instance while scrolling a text), it needs continuity''', which can be provided by opengl. When you look at apple's iphone prototype, it's not just eye candy, it's maybe the most natural/human way of navigating, because it's sufficiently realistic for the brain to forget the non-physical nature of what's inside.&lt;br /&gt;
&lt;br /&gt;
So, opengl hardware will be needed in a more or less distant hardware, for 100% fluid operation. Benchmarking will be needed to compare the different alternatives that are cited further.&lt;br /&gt;
&lt;br /&gt;
====Switching to the Enlightenment Foundation Libraries====&lt;br /&gt;
&lt;br /&gt;
Evas is a powerful and power sparing canvas drawing library. It can be OpenGL accelerated. Python/Ruby bindings are available in the &amp;quot;proto&amp;quot; e17 cvs folder.&lt;br /&gt;
&lt;br /&gt;
''Moved [[E17|here]]''&lt;br /&gt;
&lt;br /&gt;
====Clutter Toolkit====&lt;br /&gt;
&lt;br /&gt;
Clutter, an [http://o-hand.com/ OpenedHand] project, is an open source software library for creating fast, visually rich graphical user interfaces. The most obvious example of potential usage is in media center type applications.&lt;br /&gt;
&lt;br /&gt;
http://clutter-project.org/&lt;br /&gt;
&lt;br /&gt;
Clutter uses OpenGL (and optionally '''OpenGL ES''') for rendering but with an API which hides the underlying GL complexity from the developer. The Clutter API is intended to be easy to use, efficient and flexible.&lt;br /&gt;
&lt;br /&gt;
It does integrate gstreamer (for easy media playback, even camera or mic inputs), allows pango text rendering, cairo graphics rendering. Provided bindings are python, C# and Ruby.&lt;br /&gt;
&lt;br /&gt;
GTK off screen rendering is supposed to be on it's way; once it is here, there will be a possibility of using GTK apps directly within OpenGL apps as textures, which would lead to the possibility of creating a full OpenGL &amp;quot;application manager&amp;quot; (as well as media consuming app) with ZUI features.&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C, OpenGL&lt;br /&gt;
* Bindings: Python, C#, Ruby&lt;br /&gt;
* Backends: GLX / SDL / EGL&lt;br /&gt;
* Media support: Gstreamer integration, Cairo graphics rendering, Pango fonts rendering&lt;br /&gt;
* Embedding: GTK embedding&lt;br /&gt;
&lt;br /&gt;
====Graff====&lt;br /&gt;
&lt;br /&gt;
An early demonstration of Graff, which ''is a lighweight high-performance graphics rendering library.''&lt;br /&gt;
http://www.mdk.org.pl/articles/2007/04/23/chapter-1-in-which-we-meet-graff&lt;br /&gt;
&lt;br /&gt;
Be sure to check out this demo (scrolling list with inertia scrolling)&lt;br /&gt;
http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Of course it will remind you of Apple iPhone's UI. But this one runs in software mode on Nokia N770&amp;amp;800 already. The most notable part of Graff seems to be the inertia and physics integration in general.&lt;br /&gt;
&lt;br /&gt;
====Pigment API====&lt;br /&gt;
&lt;br /&gt;
Fluendo's (the Gstreamer guys) ''[https://core.fluendo.com/pigment/trac Pigment] is a Python library designed to easily build user interfaces with embedded multimedia. Its design allows to use it on several platforms, thanks to a plugin system allowing to choose the underlying graphical API. Pigment is the rendering engine of Elisa, the Fluendo Media Center project.''&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C OpenGL&lt;br /&gt;
* Bindings: Python&lt;br /&gt;
* Backends: DirectFB OpenGL&lt;br /&gt;
* Media playback integration: using Gstreamer&lt;br /&gt;
&lt;br /&gt;
===Choosing===&lt;br /&gt;
&lt;br /&gt;
Benchmarking will be needed. We have therefore to define a std testing application that would allow to compare alternatives. &lt;br /&gt;
&lt;br /&gt;
Some Clutter VS Pigment information: http://www.taimila.com/?q=node/14&lt;br /&gt;
&lt;br /&gt;
==Improvement ideas==&lt;br /&gt;
&lt;br /&gt;
Please add here any idea that seems of relevance.&lt;br /&gt;
&lt;br /&gt;
===1D list scrolling: looped physics-driven item list===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
&lt;br /&gt;
[EDIT] Graff's inertia scrolling list example: http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Take an item list (ex: adress book), print it on a ribbon of paper, and glue it on a wheel (on the tire). You're looking in the front of it, so when you want to go from the A to Z, you touch the wheel and drag it up. When you let the wheel go, it goes furter, taken by it's inertia. Stop the wheel when you got your contact. Got the idea? That's why we may speak of an &amp;quot;infinite wheel&amp;quot;, so that the surface is flat. For our case here, we always want to display square content, so the [http://en.wikipedia.org/wiki/Uniform_prism n-sided uniform prism] analogy is mathematically more exact.&lt;br /&gt;
&lt;br /&gt;
Important features:&lt;br /&gt;
* '''weight''': the biggest the item list, the faster it scrolls; that way, you don't have to wait too long for big lists, and you don't miss your item on shorter lists&lt;br /&gt;
* '''friction''': there is friction where the wheel is fixed, so that the wheel doesn't turn infinitely; more friction on short lists, less on big ones&lt;br /&gt;
* the '''initial speed and acceleration vector''' you give it determines it's futher rotation&lt;br /&gt;
* it's &amp;quot;round&amp;quot;/cyclic, so you can '''browse the list in two directions'''&lt;br /&gt;
* we may want to add a &amp;quot;progression indicator&amp;quot;, ex the current alphabetical letter, with a font size adequate to the proportion of the number of entries in the letter subcategory, or a reduced map of the distribution of the first letters...&lt;br /&gt;
 &lt;br /&gt;
We can add &amp;quot;parallel wheels&amp;quot;, symbolizing different sorting methods. Slide long to the left / right to look at a different wheel = items organization.&lt;br /&gt;
&lt;br /&gt;
====Controls====&lt;br /&gt;
&lt;br /&gt;
* Sliding up/down = Single click + maintained for a minimal distance&lt;br /&gt;
&lt;br /&gt;
Effect: scroll in an inverted/negated fashion (slide down = scroll up, slide up = scroll down)&lt;br /&gt;
&lt;br /&gt;
When finger is released (i.e. touchscreen doesn't detect any press):&lt;br /&gt;
  if (last_speed_seen &amp;gt; 0 ) then keep this speed and acceleration, with friction&lt;br /&gt;
  else stop scrolling&lt;br /&gt;
&lt;br /&gt;
Scrolling here is seen as unidimensional, but can apply to bidimensional situations (ex: zoomed image) too&lt;br /&gt;
&lt;br /&gt;
* Action = quick double tap&lt;br /&gt;
&lt;br /&gt;
* Details/select = short single tap&lt;br /&gt;
&lt;br /&gt;
* Right click = long tap&lt;br /&gt;
&lt;br /&gt;
* Sliding left/right: switch sorting method&lt;br /&gt;
&lt;br /&gt;
====Parts to modify====&lt;br /&gt;
&lt;br /&gt;
''Having a scroll that isn't a 1:1 map to the user's action isn't hard. It's just an extra calculation in the scroll code.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;---- Where is the scroll code? :)&lt;br /&gt;
&lt;br /&gt;
* libmokoui&lt;br /&gt;
** [[Stylus_Scrolling | Stylus scrolling widget]]&lt;br /&gt;
** [[Finger_Scrolling | Finger scrolling wheel widget]]&lt;br /&gt;
* gtk&lt;br /&gt;
** [http://www.gtk.org/api/2.6/gtk/GtkVScrollbar.html GtkVScrollbar]&lt;br /&gt;
&lt;br /&gt;
The best would be to add the feature for both finger and stylus scrolling.&lt;br /&gt;
&lt;br /&gt;
TODO:&lt;br /&gt;
* make the entire list a &amp;quot;scrolling zone&amp;quot;, i.e. an overlay transparent scrolling widget?&lt;br /&gt;
* define controls&lt;br /&gt;
* add the inertia feature&lt;br /&gt;
&lt;br /&gt;
===1D Scrolling: inertia friction integration into openmoko's finger wheel=== &lt;br /&gt;
&lt;br /&gt;
The same, but for the wheel. It can be very short to do: you don't have 1:1 anymore, but, for example, 1/4 wheel turn = 1 item. It's demultiplicated, but has inertia.&lt;br /&gt;
&lt;br /&gt;
===Left-handed UI Support===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
A discussion on the community list identified a desire to have the ability to switch the OpenMoko UI into &amp;quot;left-handed&amp;quot; mode.  &lt;br /&gt;
&lt;br /&gt;
 The main problem is scrollbars, when they're on the right, dragging  &lt;br /&gt;
 the scrollbar left handed results in your hand covering the screen so  &lt;br /&gt;
 you can't see what you are doing. So having the option of scrollbars  &lt;br /&gt;
 on the left would be useful.&lt;br /&gt;
&lt;br /&gt;
 I don't think the whole screen should be mirrored! There are some elements&lt;br /&gt;
 that should remain..like the main top bar with the status icons and such.&lt;br /&gt;
 Scrollbars are the main thing I can think of right now.&lt;br /&gt;
&lt;br /&gt;
===Handgesture recognition proposals===&lt;br /&gt;
&lt;br /&gt;
====Using simple, localized warp as modifier key====&lt;br /&gt;
&lt;br /&gt;
As discussed on community list:&lt;br /&gt;
&lt;br /&gt;
  If you hold down one finger and tap the other one, the mouse pops over and back&lt;br /&gt;
  again. If you keep your second finger touching, the cursor follows it. When you&lt;br /&gt;
  release it, cursor goes back to first finger position. This could be a way to&lt;br /&gt;
  set a bounding box or turn on the mode. So the second finger can do something&lt;br /&gt;
  like rotating around the first, or increase or lower the distance to the first.&lt;br /&gt;
&lt;br /&gt;
* the so-called &amp;quot;first touch&amp;quot; can be done on the mokowheel zone itself: put your left thumb on the black area; if you touch the screen with another finger, there is a '''warp'''; the warp is detectable and allows to enter &amp;quot;fake multi-touchscreen mode&amp;quot;&lt;br /&gt;
* afterwards,&lt;br /&gt;
     * slide your right-hand finger down, it scrolls up&lt;br /&gt;
     * slide your right-hand finger up, it scrolls down&lt;br /&gt;
     * slide it left, next page/item&lt;br /&gt;
     * slide it right, previous page/item&lt;br /&gt;
     * do a circle: rotation&lt;br /&gt;
     * narrow towards the black circle: zoom -&lt;br /&gt;
     * go away: zoom +&lt;br /&gt;
* if you had kept your first finger on the black quarter circle, you can continue issuing other gestures&lt;br /&gt;
&lt;br /&gt;
The advantages of using simple origin-driven cursor warping as double touch detection criteria is that:&lt;br /&gt;
* you don't have to use the wheel as button, which would slow things down and generate errors (false button presses)&lt;br /&gt;
* simpler detection algorithms that can pass by the fluctuation due to pressure relative distribution&lt;br /&gt;
* the space taken by the wheel itself is &amp;quot;useless&amp;quot; (i.e. displays no information); using it as modifier allows to keep the screen clean for reading&lt;br /&gt;
* the origin of this zone lets use maximum surface of the screen, allowing more fine controlling&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_rotate_right.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_previous.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_down.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_zoom-.png]]&lt;br /&gt;
&lt;br /&gt;
*Pros:&lt;br /&gt;
** who said we need multi-touch hardware?&lt;br /&gt;
** this may be the easiest way (in terms of design/implementation complexity, reliability)&lt;br /&gt;
*Cons: &lt;br /&gt;
** no matter what we'll invent, we'll need two hands for on-the-move controlling&lt;br /&gt;
** what about left-handed people?&lt;br /&gt;
&lt;br /&gt;
====What is to modify ?====&lt;br /&gt;
&lt;br /&gt;
We need to emulate key presses. We need to work at a layer where we can get raw cursor coordinates. &amp;lt;---- X server layer?&lt;br /&gt;
&lt;br /&gt;
====Full multi-touch emulation====&lt;br /&gt;
&lt;br /&gt;
Doable, but tricky...&lt;br /&gt;
&lt;br /&gt;
==Open questions==&lt;br /&gt;
&lt;br /&gt;
* will the neo/openmoko graphics system be powerful enough for such uses? I apple uses an OpenGL ES acceleration on this device (as well as on recent iPods), which is on the way with [[GTA02#.22Phase_2.22_.28GTA02.2C_.22Mass_Market.22.29|GTA02]].&lt;br /&gt;
* how does the touchscreen behave? We need a detailed touchscreen wiki information page, with visual traces. How hardware-specific is it?&lt;br /&gt;
* is multi touch really that awesome? I guess not.&lt;br /&gt;
&lt;br /&gt;
{{Languages|UI Improvements}}&lt;br /&gt;
&lt;br /&gt;
[[Category:User Interfaces| ]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/UI_Improvements</id>
		<title>UI Improvements</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/UI_Improvements"/>
				<updated>2007-07-27T17:00:27Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Pigment API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
  Obviously the tools are in the wild to build interfaces that could rival&lt;br /&gt;
  (or better IMO) anything Apple comes up with. We just need to organize&lt;br /&gt;
  this stuff. This would need hardware that can support dynamic&lt;br /&gt;
  interfaces. I can help here, too.&lt;br /&gt;
  sean@openmoko.com&lt;br /&gt;
&lt;br /&gt;
In fact, this place shall be dedicated to human-machine interactions improvements discussion;&lt;br /&gt;
&lt;br /&gt;
Human-machine interaction can be separated into several aspects:&lt;br /&gt;
* the physical contact/input device: the mono-touch touchscreen&lt;br /&gt;
* the graphics: &lt;br /&gt;
** accelerated rendering can add more consistency to zooming user interfaces, which seem to be quite an interesting concept for embedded scrensize-limited devices&lt;br /&gt;
** adding physics &amp;quot;look and feel&amp;quot; to (ex: menu's) behaviours can add coherence too&lt;br /&gt;
* the input methods&lt;br /&gt;
** the virtual keyboard&lt;br /&gt;
** handgestures&lt;br /&gt;
&lt;br /&gt;
==Finding inspiration ...==&lt;br /&gt;
&lt;br /&gt;
===Seen Live===&lt;br /&gt;
&lt;br /&gt;
'''Multi-touch'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=89sz8ExZndc Multi-Touchscreen experiments video @youtube]&lt;br /&gt;
*[http://www.youtube.com/watch?v=nPqqfVLQ_qY iPhone UI features demo @youtube]&lt;br /&gt;
&lt;br /&gt;
'''Zooming user interfaces'''&lt;br /&gt;
*[http://www.zenzui.com/products.html ZenZui], a [http://en.wikipedia.org/wiki/ZUI ZUI (zooming user interface)]&lt;br /&gt;
*[http://labs.live.com/Deepfish/videos.aspx Microsoft Bluefish's ZUI] (new mobile webbrowser)&lt;br /&gt;
*[http://googlesystem.blogspot.com/2007/04/opera-920-more-homepages-at-your.html Opera speed dial]&lt;br /&gt;
&lt;br /&gt;
'''Graphics'''&lt;br /&gt;
*[http://www.rasterman.com/files/eem.avi EEM], Rasterman's EFL libs on handelds proof of concept (doesn't DO anything, just showing off the EFLs on a handeld)&lt;br /&gt;
*[http://www.youtube.com/watch?v=8kLFPfaxQ6U&amp;amp;eurl= Nvidia's cutting-edge techno], an [http://www.khronos.org/openkode/ Openkode] demo.&lt;br /&gt;
&lt;br /&gt;
'''Science fiction'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=G_FS2TiK3AI UPMC Future?]&lt;br /&gt;
&lt;br /&gt;
'''Links:'''&lt;br /&gt;
*[http://elevate.sourceforge.net/links.html elevate project's links] sums up quite greatly the latest innovations in the desktop area&lt;br /&gt;
*[http://nooface.net/ Nooface] is a human-machine news site&lt;br /&gt;
*Asus-Intel's [http://www.hothardware.com/articles/Hands_on_with_the_ASUS_Eee/?page=2 Eee]'s interface&lt;br /&gt;
&lt;br /&gt;
===Clever hacks===&lt;br /&gt;
&lt;br /&gt;
It's been said that having no multitouch screen allows less freedom for innovation. Maybe we could get something out of our touchscreen drivers.&lt;br /&gt;
&lt;br /&gt;
Why ? Think of apple's scroll up/down feature on macbooks touchpads (which '''aren't multi touch''', it's a [http://iscroll2.sourceforge.net/ clever driver hack, iscroll2]):&lt;br /&gt;
&lt;br /&gt;
  To scroll, just place two fingers on your trackpad instead of one. Both fingers&lt;br /&gt;
  need to be placed next to each other horizontally (not vertically, the trackpad &lt;br /&gt;
  cannot detect that). Some people get better results with their finger spaced a&lt;br /&gt;
  little bit apart, while others prefer having the fingers right next to each other.&lt;br /&gt;
&lt;br /&gt;
  iScroll2 provides two scrolling modes: Linear and circular scrolling.&lt;br /&gt;
&lt;br /&gt;
  For linear scrolling, move the two fingers up/down or left/right in a straight &lt;br /&gt;
  line, respectively, to scroll in that direction.&lt;br /&gt;
&lt;br /&gt;
  Circular scrolling works in a way similar to the iPod's scroll wheel: Move the two&lt;br /&gt;
  fingers in a circle to scroll up or down, depending   on whether you move in a &lt;br /&gt;
  clockwise or counterclockwise direction.&lt;br /&gt;
&lt;br /&gt;
Maybe we can port/adapt/get inspiration from this macintosh driver.&lt;br /&gt;
&lt;br /&gt;
===n-D navigation: the polyhedra inspiration===&lt;br /&gt;
&lt;br /&gt;
When we want to navigate files, mp3s in an mp3 player, etc... Every control that the application needs is a button. What about looking at the polyhedrons? We could find one for each usage, with as many surrounding subzones that may be used as controls. Ex: you need 5 buttons, let's take a pentagon with 5 surrounding zones all around. That way, it's always optimized...&lt;br /&gt;
&lt;br /&gt;
http://en.wikipedia.org/wiki/Polyhedra&lt;br /&gt;
http://en.wikipedia.org/wiki/List_of_uniform_polyhedra&lt;br /&gt;
&lt;br /&gt;
===Our weapons===&lt;br /&gt;
&lt;br /&gt;
We can't improve the human-machine interface without knowing the strengths / weaknesses of our hardware; some of the weaknesses might turn out as exploitable features, some strengths as limiting constraints.&lt;br /&gt;
&lt;br /&gt;
====The touchscreen====&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What exactly does the touchscreen see when  you touch the screen with 2 fingers&lt;br /&gt;
  at the same time, when you move them, when you move only one of the 2, etc. I'm &lt;br /&gt;
  also interested in knowing how precise the touchscreen is (ex: refresh rate, &lt;br /&gt;
  possible pressure indication, ...)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* The output is the center of the bounding box of the touched area&lt;br /&gt;
* The touch point skips instantly on double touch&lt;br /&gt;
* Pressure has almost no effect on a single touch, but not so on a double touch. The relative pressures will cause a significant skewing effect towards the harder touch. You can easily move the pointer along the line between your two fingers by changing the relative pressure.&lt;br /&gt;
&lt;br /&gt;
Conclusions:&lt;br /&gt;
* we can detect double touch as jumps, and that's all&lt;br /&gt;
* no pressure&lt;br /&gt;
* This could be an interesting input method for games - e.g. holding the Neo in landscape view, letting each thumb rest on a specific input area; probably needs to be checked for usability with a real device&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when sliding two fingers in parallel up(L,R)-&amp;gt;down(L,R)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see a slide along the center line between your two fingers. In practice, you can't keep the pressure equal, so you will see some kind of zig-zag line somewhere between the two pressure points in the direction of your slide.&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when narrowing two fingers in slide (=zoom effect on iphone)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see the pointer stay at the center of the zoom movement. In practice, you can't keep the pressure equal for both fingers, so the pointer will move towards one of the two pressure points.&lt;br /&gt;
&lt;br /&gt;
====Graphics and computational capabilities====&lt;br /&gt;
&lt;br /&gt;
It would be good to report what performance the current hardware allows:&lt;br /&gt;
* There was no pure X11 benchmarking done (AFAIK) (how many fps at full VGA scrolling, ex: 1024*480 image scrolling?)&lt;br /&gt;
* what about the lcd reactivity? What if we don't see anything but blur while moving items fast?&lt;br /&gt;
&lt;br /&gt;
Please report here your impressions.&lt;br /&gt;
&lt;br /&gt;
==Areas of improvement==&lt;br /&gt;
&lt;br /&gt;
* OpenGL for fluid zooming interfaces (2D: the infinite sphere model, 1D: the infinite wheel of fortune/ribbon model, exposé)&lt;br /&gt;
* HandGestures&lt;br /&gt;
* Physics-model based improvements: inertia and friction&lt;br /&gt;
* multi touch screen for natural handgestures &lt;br /&gt;
* improved virtual keyboard&lt;br /&gt;
* switching to another GUI toolkit (EFLs)&lt;br /&gt;
&lt;br /&gt;
===Physics-inspired animation a.k.a. &amp;quot;Digital Physics&amp;quot;===&lt;br /&gt;
&lt;br /&gt;
If we want to add eye candy &amp;amp; usability to the UI (such as smooth realistic list scrolling, as seen in apple's&lt;br /&gt;
iphone demo on contacts lists for instance), we'll need a physics engine, so that moves &amp;amp; animations aren't all linear.&lt;br /&gt;
&lt;br /&gt;
The following aticle explains the [http://www.readwriteweb.com/archives/the_physics_of_iphone.php Digital Physics] term from the iPhone example.&lt;br /&gt;
&lt;br /&gt;
The most used technique for calculating trajectories and systems of related geometrical objects seems to be [http://en.wikipedia.org/wiki/Verlet_integration verlet integration] implementation; it is an alternative to Euler's integration method, using fast approximation. &lt;br /&gt;
&lt;br /&gt;
We may have no need for such a mathematical method at first, but perhaps there are other use cases. For instance, it may be useful to gesture recognition (i'm not aware if existing gesture recognition engines measure speed, acceleration...).&lt;br /&gt;
&lt;br /&gt;
====Open Dynamics Engine====&lt;br /&gt;
&lt;br /&gt;
ODE is an open source, high performance library for simulating rigid body dynamics. It is fully featured, stable, mature and platform independent with an easy to use C/C++ API. It has advanced joint types and integrated collision detection with friction. ODE is useful for simulating vehicles, objects in virtual reality environments and virtual creatures. It is currently used in many computer games, 3D authoring tools and simulation tools.&lt;br /&gt;
&lt;br /&gt;
http://www.ode.org/&lt;br /&gt;
&lt;br /&gt;
====Libakamaru====&lt;br /&gt;
&lt;br /&gt;
The [http://people.freedesktop.org/~krh/akamaru.git/ akamaru library] is the code behind [http://www.youtube.com/watch?v=VekgyKQoTeM kiba dock]'s fun and dynamic behaviour. It's dependencies are light (needs just GLib). It takes elasticity, friction, gravity into account.&lt;br /&gt;
&lt;br /&gt;
If you want to take a quick look at the code:&lt;br /&gt;
svn co http://svn.kiba-dock.org/akamaru/ akamaru&lt;br /&gt;
&lt;br /&gt;
The only (AFAIK) application using this library is kiba-dock, a *fun* app launcher, but we may find another use to it in the future.&lt;br /&gt;
&lt;br /&gt;
As suggested on the mailing list, it is mostly overkill for the uses we intend to have, but this library may be optimized already, the API can spare some time for too. Furthermore, ''Qui peut le plus, peut le moins''.&lt;br /&gt;
&lt;br /&gt;
====Verlet integration implementation from e17====&lt;br /&gt;
&lt;br /&gt;
There's an undergoing verlet integration implementation into the e17 project (by rephorm) see http://rephorm.com/news/tag/physics , so we may see some UI physics integration into e17 someday.&lt;br /&gt;
&lt;br /&gt;
====Robert Pernner's easy equations====&lt;br /&gt;
&lt;br /&gt;
http://www.robertpenner.com/easing/&lt;br /&gt;
&lt;br /&gt;
See the demo: implements non linear behaviour (actionscript), but may give inspiration&lt;br /&gt;
&lt;br /&gt;
===Extending the touchscreen capabilities and input methods===&lt;br /&gt;
&lt;br /&gt;
* '''Multitouchscreen emulation'''&lt;br /&gt;
&lt;br /&gt;
If we got it right, when touching the screen on a second place, the cursor oscillates between the two points depending on relative pressure distribution. Using averaging algorithms, we may have the opportunity to detect peculiar behaviours.&lt;br /&gt;
&lt;br /&gt;
We need raw data (x,y,t) from the real hardware for the following behaviours:&lt;br /&gt;
* slide two fingers in parallel - vertical up/down (scroll)&lt;br /&gt;
* turn the two fingers around (rotate)&lt;br /&gt;
* slide two fingers towards each other (zoom-)&lt;br /&gt;
* slide two fingers apart (zoom+)&lt;br /&gt;
&lt;br /&gt;
When touching the screen with two fingers at the same time, we necessarily see the two points, or are able to extrapolate the position of the second one. This solution can add feature, but will probably be little erratic...&lt;br /&gt;
&lt;br /&gt;
* '''Touchscreen kernel module hacking'''&lt;br /&gt;
&lt;br /&gt;
We may correct the &amp;quot;half distance&amp;quot; phenomenon on double touch: if double touch is detected, then assimilate the cursor as twice further than the first touch. It would allow finer control, but higher instability.&lt;br /&gt;
&lt;br /&gt;
The double touch detection may be implemented in the driver itself, as well as stabilization.&lt;br /&gt;
&lt;br /&gt;
* '''Other detectable behaviours'''&lt;br /&gt;
&lt;br /&gt;
The warping can be used in the 4 diagonals, plus the up/down/right/left cross:&lt;br /&gt;
&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
  - 1            -  - 1          2 -  - 1            -  -      2       -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -             2-  -              -  - 2            -  -      1       -&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
&lt;br /&gt;
It's not double touch, but two sequential presses with a short time in between (~0.5 s)&lt;br /&gt;
&lt;br /&gt;
===Improved virtual keyboard===&lt;br /&gt;
&lt;br /&gt;
One nice idea for virtual input is [http://www.micropp.se/openmoko/ finger-splash]&lt;br /&gt;
&lt;br /&gt;
Yet, optimization does not only apply to the plain one-letter-at-a-time input. We need some sort of T9 (dictionary-based input help). When typing a word, the first letter determines the next possible ones. Therefore, we may let disappear the less-probable following letters. Ex: type an L, there's no way an X follows...&lt;br /&gt;
&lt;br /&gt;
Hints: &lt;br /&gt;
* ZIP's huffmann compression applied to SMSs/mails for detecting the most used characters/words/sentences.&lt;br /&gt;
* html tag-clouds, one-letter tag clouds ; font size proportional to the probability of being used&lt;br /&gt;
&lt;br /&gt;
The most critical point is the initial disposition of the letters, before any letter is typed. We may also want to use horizontal two-parts keyboard (with the neo in hands like a psp..)&lt;br /&gt;
&lt;br /&gt;
The [http://www.strout.net/info/ideas/hexinput.html hexinput] concept is interesting. What about hiding the less probable letters and increasing the remaining ones during typing?&lt;br /&gt;
&lt;br /&gt;
===Towards OpenGL compositing===&lt;br /&gt;
&lt;br /&gt;
There are [http://www.hbmobile.org/wiki/index.php?title=GUI_Frameworks lots of possible GUI frameworks] with various software architectures that could be used for OpenMoko.&lt;br /&gt;
&lt;br /&gt;
GTA01 hardware uses GTK+/matchbox without hardware acceleration, and it's not enough: this is a first that a mobile Linux device has such a high DPI resolution. OpenGL ES compositing seems to have a bright future on embedded devices, because compositing seems to give natural zooming interfaces reality (at last!).&lt;br /&gt;
&lt;br /&gt;
Considering recent changes in destkop applications, opengl has a definite future. For instance, the expose (be it apple's or beryl's) is a very interesting and usable feature. Using compositing allows the physics metaphore: '''the human brain doesn't like &amp;quot;gaps&amp;quot;/jumps (for instance while scrolling a text), it needs continuity''', which can be provided by opengl. When you look at apple's iphone prototype, it's not just eye candy, it's maybe the most natural/human way of navigating, because it's sufficiently realistic for the brain to forget the non-physical nature of what's inside.&lt;br /&gt;
&lt;br /&gt;
So, opengl hardware will be needed in a more or less distant hardware, for 100% fluid operation. Benchmarking will be needed to compare the different alternatives that are cited further.&lt;br /&gt;
&lt;br /&gt;
====Switching to the Enlightenment Foundation Libraries====&lt;br /&gt;
&lt;br /&gt;
Evas is a powerful and power sparing canvas drawing library. It can be OpenGL accelerated. Python/Ruby bindings are available in the &amp;quot;proto&amp;quot; e17 cvs folder.&lt;br /&gt;
&lt;br /&gt;
''Moved [[E17|here]]''&lt;br /&gt;
&lt;br /&gt;
====Clutter Toolkit====&lt;br /&gt;
&lt;br /&gt;
Clutter, an [http://o-hand.com/ OpenedHand] project, is an open source software library for creating fast, visually rich graphical user interfaces. The most obvious example of potential usage is in media center type applications.&lt;br /&gt;
&lt;br /&gt;
http://clutter-project.org/&lt;br /&gt;
&lt;br /&gt;
Clutter uses OpenGL (and optionally '''OpenGL ES''') for rendering but with an API which hides the underlying GL complexity from the developer. The Clutter API is intended to be easy to use, efficient and flexible.&lt;br /&gt;
&lt;br /&gt;
It does integrate gstreamer (for easy media playback, even camera or mic inputs), allows pango text rendering, cairo graphics rendering. Provided bindings are python, C# and Ruby.&lt;br /&gt;
&lt;br /&gt;
GTK off screen rendering is supposed to be on it's way; once it is here, there will be a possibility of using GTK apps directly within OpenGL apps as textures, which would lead to the possibility of creating a full OpenGL &amp;quot;application manager&amp;quot; (as well as media consuming app) with ZUI features.&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C, OpenGL&lt;br /&gt;
* Bindings: Python, C#, Ruby&lt;br /&gt;
* Backends: GLX / SDL / EGL&lt;br /&gt;
* Media support: Gstreamer integration, Cairo graphics rendering, Pango fonts rendering&lt;br /&gt;
* Embedding: GTK embedding&lt;br /&gt;
&lt;br /&gt;
====Graff====&lt;br /&gt;
&lt;br /&gt;
An early demonstration of Graff, which ''is a lighweight high-performance graphics rendering library.''&lt;br /&gt;
http://www.mdk.org.pl/articles/2007/04/23/chapter-1-in-which-we-meet-graff&lt;br /&gt;
&lt;br /&gt;
Be sure to check out this demo (scrolling list with inertia scrolling)&lt;br /&gt;
http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Of course it will remind you of Apple iPhone's UI. But this one runs in software mode on Nokia N770&amp;amp;800 already. The most notable part of Graff seems to be the inertia and physics integration in general.&lt;br /&gt;
&lt;br /&gt;
====Pigment API====&lt;br /&gt;
&lt;br /&gt;
Fluendo's (the Gstreamer guys) ''[https://core.fluendo.com/pigment/trac Pigment] is a Python library designed to easily build user interfaces with embedded multimedia. Its design allows to use it on several platforms, thanks to a plugin system allowing to choose the underlying graphical API. Pigment is the rendering engine of Elisa, the Fluendo Media Center project.''&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C OpenGL&lt;br /&gt;
* Bindings: Python&lt;br /&gt;
* Backends: DirectFB OpenGL&lt;br /&gt;
* Media playback integration: using Gstreamer&lt;br /&gt;
&lt;br /&gt;
===Choosing===&lt;br /&gt;
&lt;br /&gt;
Benchmarking will be needed. We have therefore to define a std testing application that would allow to compare alternatives. &lt;br /&gt;
&lt;br /&gt;
Some Clutter VS Pigment information: http://www.taimila.com/?q=node/14&lt;br /&gt;
&lt;br /&gt;
==Improvement ideas==&lt;br /&gt;
&lt;br /&gt;
Please add here any idea that seems of relevance.&lt;br /&gt;
&lt;br /&gt;
===1D list scrolling: looped physics-driven item list===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
&lt;br /&gt;
Take an item list (ex: adress book), print it on a ribbon of paper, and glue it on a wheel (on the tire). You're looking in the front of it, so when you want to go from the A to Z, you touch the wheel and drag it up. When you let the wheel go, it goes furter, taken by it's inertia. Stop the wheel when you got your contact. Got the idea? That's why we may speak of an &amp;quot;infinite wheel&amp;quot;, so that the surface is flat. For our case here, we always want to display square content, so the [http://en.wikipedia.org/wiki/Uniform_prism n-sided uniform prism] analogy is mathematically more exact.&lt;br /&gt;
&lt;br /&gt;
Important features:&lt;br /&gt;
* '''weight''': the biggest the item list, the faster it scrolls; that way, you don't have to wait too long for big lists, and you don't miss your item on shorter lists&lt;br /&gt;
* '''friction''': there is friction where the wheel is fixed, so that the wheel doesn't turn infinitely; more friction on short lists, less on big ones&lt;br /&gt;
* the '''initial speed and acceleration vector''' you give it determines it's futher rotation&lt;br /&gt;
* it's &amp;quot;round&amp;quot;/cyclic, so you can '''browse the list in two directions'''&lt;br /&gt;
* we may want to add a &amp;quot;progression indicator&amp;quot;, ex the current alphabetical letter, with a font size adequate to the proportion of the number of entries in the letter subcategory, or a reduced map of the distribution of the first letters...&lt;br /&gt;
 &lt;br /&gt;
We can add &amp;quot;parallel wheels&amp;quot;, symbolizing different sorting methods. Slide long to the left / right to look at a different wheel = items organization.&lt;br /&gt;
&lt;br /&gt;
====Controls====&lt;br /&gt;
&lt;br /&gt;
* Sliding up/down = Single click + maintained for a minimal distance&lt;br /&gt;
&lt;br /&gt;
Effect: scroll in an inverted/negated fashion (slide down = scroll up, slide up = scroll down)&lt;br /&gt;
&lt;br /&gt;
When finger is released (i.e. touchscreen doesn't detect any press):&lt;br /&gt;
  if (last_speed_seen &amp;gt; 0 ) then keep this speed and acceleration, with friction&lt;br /&gt;
  else stop scrolling&lt;br /&gt;
&lt;br /&gt;
Scrolling here is seen as unidimensional, but can apply to bidimensional situations (ex: zoomed image) too&lt;br /&gt;
&lt;br /&gt;
* Action = quick double tap&lt;br /&gt;
&lt;br /&gt;
* Details/select = short single tap&lt;br /&gt;
&lt;br /&gt;
* Right click = long tap&lt;br /&gt;
&lt;br /&gt;
* Sliding left/right: switch sorting method&lt;br /&gt;
&lt;br /&gt;
====Parts to modify====&lt;br /&gt;
&lt;br /&gt;
''Having a scroll that isn't a 1:1 map to the user's action isn't hard. It's just an extra calculation in the scroll code.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;---- Where is the scroll code? :)&lt;br /&gt;
&lt;br /&gt;
* libmokoui&lt;br /&gt;
** [[Stylus_Scrolling | Stylus scrolling widget]]&lt;br /&gt;
** [[Finger_Scrolling | Finger scrolling wheel widget]]&lt;br /&gt;
* gtk&lt;br /&gt;
** [http://www.gtk.org/api/2.6/gtk/GtkVScrollbar.html GtkVScrollbar]&lt;br /&gt;
&lt;br /&gt;
The best would be to add the feature for both finger and stylus scrolling.&lt;br /&gt;
&lt;br /&gt;
TODO:&lt;br /&gt;
* make the entire list a &amp;quot;scrolling zone&amp;quot;, i.e. an overlay transparent scrolling widget?&lt;br /&gt;
* define controls&lt;br /&gt;
* add the inertia feature&lt;br /&gt;
&lt;br /&gt;
===1D Scrolling: inertia friction integration into openmoko's finger wheel=== &lt;br /&gt;
&lt;br /&gt;
The same, but for the wheel. It can be very short to do: you don't have 1:1 anymore, but, for example, 1/4 wheel turn = 1 item. It's demultiplicated, but has inertia.&lt;br /&gt;
&lt;br /&gt;
===Left-handed UI Support===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
A discussion on the community list identified a desire to have the ability to switch the OpenMoko UI into &amp;quot;left-handed&amp;quot; mode.  &lt;br /&gt;
&lt;br /&gt;
 The main problem is scrollbars, when they're on the right, dragging  &lt;br /&gt;
 the scrollbar left handed results in your hand covering the screen so  &lt;br /&gt;
 you can't see what you are doing. So having the option of scrollbars  &lt;br /&gt;
 on the left would be useful.&lt;br /&gt;
&lt;br /&gt;
 I don't think the whole screen should be mirrored! There are some elements&lt;br /&gt;
 that should remain..like the main top bar with the status icons and such.&lt;br /&gt;
 Scrollbars are the main thing I can think of right now.&lt;br /&gt;
&lt;br /&gt;
===Handgesture recognition proposals===&lt;br /&gt;
&lt;br /&gt;
====Using simple, localized warp as modifier key====&lt;br /&gt;
&lt;br /&gt;
As discussed on community list:&lt;br /&gt;
&lt;br /&gt;
  If you hold down one finger and tap the other one, the mouse pops over and back&lt;br /&gt;
  again. If you keep your second finger touching, the cursor follows it. When you&lt;br /&gt;
  release it, cursor goes back to first finger position. This could be a way to&lt;br /&gt;
  set a bounding box or turn on the mode. So the second finger can do something&lt;br /&gt;
  like rotating around the first, or increase or lower the distance to the first.&lt;br /&gt;
&lt;br /&gt;
* the so-called &amp;quot;first touch&amp;quot; can be done on the mokowheel zone itself: put your left thumb on the black area; if you touch the screen with another finger, there is a '''warp'''; the warp is detectable and allows to enter &amp;quot;fake multi-touchscreen mode&amp;quot;&lt;br /&gt;
* afterwards,&lt;br /&gt;
     * slide your right-hand finger down, it scrolls up&lt;br /&gt;
     * slide your right-hand finger up, it scrolls down&lt;br /&gt;
     * slide it left, next page/item&lt;br /&gt;
     * slide it right, previous page/item&lt;br /&gt;
     * do a circle: rotation&lt;br /&gt;
     * narrow towards the black circle: zoom -&lt;br /&gt;
     * go away: zoom +&lt;br /&gt;
* if you had kept your first finger on the black quarter circle, you can continue issuing other gestures&lt;br /&gt;
&lt;br /&gt;
The advantages of using simple origin-driven cursor warping as double touch detection criteria is that:&lt;br /&gt;
* you don't have to use the wheel as button, which would slow things down and generate errors (false button presses)&lt;br /&gt;
* simpler detection algorithms that can pass by the fluctuation due to pressure relative distribution&lt;br /&gt;
* the space taken by the wheel itself is &amp;quot;useless&amp;quot; (i.e. displays no information); using it as modifier allows to keep the screen clean for reading&lt;br /&gt;
* the origin of this zone lets use maximum surface of the screen, allowing more fine controlling&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_rotate_right.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_previous.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_down.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_zoom-.png]]&lt;br /&gt;
&lt;br /&gt;
*Pros:&lt;br /&gt;
** who said we need multi-touch hardware?&lt;br /&gt;
** this may be the easiest way (in terms of design/implementation complexity, reliability)&lt;br /&gt;
*Cons: &lt;br /&gt;
** no matter what we'll invent, we'll need two hands for on-the-move controlling&lt;br /&gt;
** what about left-handed people?&lt;br /&gt;
&lt;br /&gt;
====What is to modify ?====&lt;br /&gt;
&lt;br /&gt;
We need to emulate key presses. We need to work at a layer where we can get raw cursor coordinates. &amp;lt;---- X server layer?&lt;br /&gt;
&lt;br /&gt;
====Full multi-touch emulation====&lt;br /&gt;
&lt;br /&gt;
Doable, but tricky...&lt;br /&gt;
&lt;br /&gt;
==Open questions==&lt;br /&gt;
&lt;br /&gt;
* will the neo/openmoko graphics system be powerful enough for such uses? I apple uses an OpenGL ES acceleration on this device (as well as on recent iPods), which is on the way with [[GTA02#.22Phase_2.22_.28GTA02.2C_.22Mass_Market.22.29|GTA02]].&lt;br /&gt;
* how does the touchscreen behave? We need a detailed touchscreen wiki information page, with visual traces. How hardware-specific is it?&lt;br /&gt;
* is multi touch really that awesome? I guess not.&lt;br /&gt;
&lt;br /&gt;
{{Languages|UI Improvements}}&lt;br /&gt;
&lt;br /&gt;
[[Category:User Interfaces| ]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/UI_Improvements</id>
		<title>UI Improvements</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/UI_Improvements"/>
				<updated>2007-07-27T17:00:02Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Pigment API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
  Obviously the tools are in the wild to build interfaces that could rival&lt;br /&gt;
  (or better IMO) anything Apple comes up with. We just need to organize&lt;br /&gt;
  this stuff. This would need hardware that can support dynamic&lt;br /&gt;
  interfaces. I can help here, too.&lt;br /&gt;
  sean@openmoko.com&lt;br /&gt;
&lt;br /&gt;
In fact, this place shall be dedicated to human-machine interactions improvements discussion;&lt;br /&gt;
&lt;br /&gt;
Human-machine interaction can be separated into several aspects:&lt;br /&gt;
* the physical contact/input device: the mono-touch touchscreen&lt;br /&gt;
* the graphics: &lt;br /&gt;
** accelerated rendering can add more consistency to zooming user interfaces, which seem to be quite an interesting concept for embedded scrensize-limited devices&lt;br /&gt;
** adding physics &amp;quot;look and feel&amp;quot; to (ex: menu's) behaviours can add coherence too&lt;br /&gt;
* the input methods&lt;br /&gt;
** the virtual keyboard&lt;br /&gt;
** handgestures&lt;br /&gt;
&lt;br /&gt;
==Finding inspiration ...==&lt;br /&gt;
&lt;br /&gt;
===Seen Live===&lt;br /&gt;
&lt;br /&gt;
'''Multi-touch'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=89sz8ExZndc Multi-Touchscreen experiments video @youtube]&lt;br /&gt;
*[http://www.youtube.com/watch?v=nPqqfVLQ_qY iPhone UI features demo @youtube]&lt;br /&gt;
&lt;br /&gt;
'''Zooming user interfaces'''&lt;br /&gt;
*[http://www.zenzui.com/products.html ZenZui], a [http://en.wikipedia.org/wiki/ZUI ZUI (zooming user interface)]&lt;br /&gt;
*[http://labs.live.com/Deepfish/videos.aspx Microsoft Bluefish's ZUI] (new mobile webbrowser)&lt;br /&gt;
*[http://googlesystem.blogspot.com/2007/04/opera-920-more-homepages-at-your.html Opera speed dial]&lt;br /&gt;
&lt;br /&gt;
'''Graphics'''&lt;br /&gt;
*[http://www.rasterman.com/files/eem.avi EEM], Rasterman's EFL libs on handelds proof of concept (doesn't DO anything, just showing off the EFLs on a handeld)&lt;br /&gt;
*[http://www.youtube.com/watch?v=8kLFPfaxQ6U&amp;amp;eurl= Nvidia's cutting-edge techno], an [http://www.khronos.org/openkode/ Openkode] demo.&lt;br /&gt;
&lt;br /&gt;
'''Science fiction'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=G_FS2TiK3AI UPMC Future?]&lt;br /&gt;
&lt;br /&gt;
'''Links:'''&lt;br /&gt;
*[http://elevate.sourceforge.net/links.html elevate project's links] sums up quite greatly the latest innovations in the desktop area&lt;br /&gt;
*[http://nooface.net/ Nooface] is a human-machine news site&lt;br /&gt;
*Asus-Intel's [http://www.hothardware.com/articles/Hands_on_with_the_ASUS_Eee/?page=2 Eee]'s interface&lt;br /&gt;
&lt;br /&gt;
===Clever hacks===&lt;br /&gt;
&lt;br /&gt;
It's been said that having no multitouch screen allows less freedom for innovation. Maybe we could get something out of our touchscreen drivers.&lt;br /&gt;
&lt;br /&gt;
Why ? Think of apple's scroll up/down feature on macbooks touchpads (which '''aren't multi touch''', it's a [http://iscroll2.sourceforge.net/ clever driver hack, iscroll2]):&lt;br /&gt;
&lt;br /&gt;
  To scroll, just place two fingers on your trackpad instead of one. Both fingers&lt;br /&gt;
  need to be placed next to each other horizontally (not vertically, the trackpad &lt;br /&gt;
  cannot detect that). Some people get better results with their finger spaced a&lt;br /&gt;
  little bit apart, while others prefer having the fingers right next to each other.&lt;br /&gt;
&lt;br /&gt;
  iScroll2 provides two scrolling modes: Linear and circular scrolling.&lt;br /&gt;
&lt;br /&gt;
  For linear scrolling, move the two fingers up/down or left/right in a straight &lt;br /&gt;
  line, respectively, to scroll in that direction.&lt;br /&gt;
&lt;br /&gt;
  Circular scrolling works in a way similar to the iPod's scroll wheel: Move the two&lt;br /&gt;
  fingers in a circle to scroll up or down, depending   on whether you move in a &lt;br /&gt;
  clockwise or counterclockwise direction.&lt;br /&gt;
&lt;br /&gt;
Maybe we can port/adapt/get inspiration from this macintosh driver.&lt;br /&gt;
&lt;br /&gt;
===n-D navigation: the polyhedra inspiration===&lt;br /&gt;
&lt;br /&gt;
When we want to navigate files, mp3s in an mp3 player, etc... Every control that the application needs is a button. What about looking at the polyhedrons? We could find one for each usage, with as many surrounding subzones that may be used as controls. Ex: you need 5 buttons, let's take a pentagon with 5 surrounding zones all around. That way, it's always optimized...&lt;br /&gt;
&lt;br /&gt;
http://en.wikipedia.org/wiki/Polyhedra&lt;br /&gt;
http://en.wikipedia.org/wiki/List_of_uniform_polyhedra&lt;br /&gt;
&lt;br /&gt;
===Our weapons===&lt;br /&gt;
&lt;br /&gt;
We can't improve the human-machine interface without knowing the strengths / weaknesses of our hardware; some of the weaknesses might turn out as exploitable features, some strengths as limiting constraints.&lt;br /&gt;
&lt;br /&gt;
====The touchscreen====&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What exactly does the touchscreen see when  you touch the screen with 2 fingers&lt;br /&gt;
  at the same time, when you move them, when you move only one of the 2, etc. I'm &lt;br /&gt;
  also interested in knowing how precise the touchscreen is (ex: refresh rate, &lt;br /&gt;
  possible pressure indication, ...)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* The output is the center of the bounding box of the touched area&lt;br /&gt;
* The touch point skips instantly on double touch&lt;br /&gt;
* Pressure has almost no effect on a single touch, but not so on a double touch. The relative pressures will cause a significant skewing effect towards the harder touch. You can easily move the pointer along the line between your two fingers by changing the relative pressure.&lt;br /&gt;
&lt;br /&gt;
Conclusions:&lt;br /&gt;
* we can detect double touch as jumps, and that's all&lt;br /&gt;
* no pressure&lt;br /&gt;
* This could be an interesting input method for games - e.g. holding the Neo in landscape view, letting each thumb rest on a specific input area; probably needs to be checked for usability with a real device&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when sliding two fingers in parallel up(L,R)-&amp;gt;down(L,R)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see a slide along the center line between your two fingers. In practice, you can't keep the pressure equal, so you will see some kind of zig-zag line somewhere between the two pressure points in the direction of your slide.&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when narrowing two fingers in slide (=zoom effect on iphone)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see the pointer stay at the center of the zoom movement. In practice, you can't keep the pressure equal for both fingers, so the pointer will move towards one of the two pressure points.&lt;br /&gt;
&lt;br /&gt;
====Graphics and computational capabilities====&lt;br /&gt;
&lt;br /&gt;
It would be good to report what performance the current hardware allows:&lt;br /&gt;
* There was no pure X11 benchmarking done (AFAIK) (how many fps at full VGA scrolling, ex: 1024*480 image scrolling?)&lt;br /&gt;
* what about the lcd reactivity? What if we don't see anything but blur while moving items fast?&lt;br /&gt;
&lt;br /&gt;
Please report here your impressions.&lt;br /&gt;
&lt;br /&gt;
==Areas of improvement==&lt;br /&gt;
&lt;br /&gt;
* OpenGL for fluid zooming interfaces (2D: the infinite sphere model, 1D: the infinite wheel of fortune/ribbon model, exposé)&lt;br /&gt;
* HandGestures&lt;br /&gt;
* Physics-model based improvements: inertia and friction&lt;br /&gt;
* multi touch screen for natural handgestures &lt;br /&gt;
* improved virtual keyboard&lt;br /&gt;
* switching to another GUI toolkit (EFLs)&lt;br /&gt;
&lt;br /&gt;
===Physics-inspired animation a.k.a. &amp;quot;Digital Physics&amp;quot;===&lt;br /&gt;
&lt;br /&gt;
If we want to add eye candy &amp;amp; usability to the UI (such as smooth realistic list scrolling, as seen in apple's&lt;br /&gt;
iphone demo on contacts lists for instance), we'll need a physics engine, so that moves &amp;amp; animations aren't all linear.&lt;br /&gt;
&lt;br /&gt;
The following aticle explains the [http://www.readwriteweb.com/archives/the_physics_of_iphone.php Digital Physics] term from the iPhone example.&lt;br /&gt;
&lt;br /&gt;
The most used technique for calculating trajectories and systems of related geometrical objects seems to be [http://en.wikipedia.org/wiki/Verlet_integration verlet integration] implementation; it is an alternative to Euler's integration method, using fast approximation. &lt;br /&gt;
&lt;br /&gt;
We may have no need for such a mathematical method at first, but perhaps there are other use cases. For instance, it may be useful to gesture recognition (i'm not aware if existing gesture recognition engines measure speed, acceleration...).&lt;br /&gt;
&lt;br /&gt;
====Open Dynamics Engine====&lt;br /&gt;
&lt;br /&gt;
ODE is an open source, high performance library for simulating rigid body dynamics. It is fully featured, stable, mature and platform independent with an easy to use C/C++ API. It has advanced joint types and integrated collision detection with friction. ODE is useful for simulating vehicles, objects in virtual reality environments and virtual creatures. It is currently used in many computer games, 3D authoring tools and simulation tools.&lt;br /&gt;
&lt;br /&gt;
http://www.ode.org/&lt;br /&gt;
&lt;br /&gt;
====Libakamaru====&lt;br /&gt;
&lt;br /&gt;
The [http://people.freedesktop.org/~krh/akamaru.git/ akamaru library] is the code behind [http://www.youtube.com/watch?v=VekgyKQoTeM kiba dock]'s fun and dynamic behaviour. It's dependencies are light (needs just GLib). It takes elasticity, friction, gravity into account.&lt;br /&gt;
&lt;br /&gt;
If you want to take a quick look at the code:&lt;br /&gt;
svn co http://svn.kiba-dock.org/akamaru/ akamaru&lt;br /&gt;
&lt;br /&gt;
The only (AFAIK) application using this library is kiba-dock, a *fun* app launcher, but we may find another use to it in the future.&lt;br /&gt;
&lt;br /&gt;
As suggested on the mailing list, it is mostly overkill for the uses we intend to have, but this library may be optimized already, the API can spare some time for too. Furthermore, ''Qui peut le plus, peut le moins''.&lt;br /&gt;
&lt;br /&gt;
====Verlet integration implementation from e17====&lt;br /&gt;
&lt;br /&gt;
There's an undergoing verlet integration implementation into the e17 project (by rephorm) see http://rephorm.com/news/tag/physics , so we may see some UI physics integration into e17 someday.&lt;br /&gt;
&lt;br /&gt;
====Robert Pernner's easy equations====&lt;br /&gt;
&lt;br /&gt;
http://www.robertpenner.com/easing/&lt;br /&gt;
&lt;br /&gt;
See the demo: implements non linear behaviour (actionscript), but may give inspiration&lt;br /&gt;
&lt;br /&gt;
===Extending the touchscreen capabilities and input methods===&lt;br /&gt;
&lt;br /&gt;
* '''Multitouchscreen emulation'''&lt;br /&gt;
&lt;br /&gt;
If we got it right, when touching the screen on a second place, the cursor oscillates between the two points depending on relative pressure distribution. Using averaging algorithms, we may have the opportunity to detect peculiar behaviours.&lt;br /&gt;
&lt;br /&gt;
We need raw data (x,y,t) from the real hardware for the following behaviours:&lt;br /&gt;
* slide two fingers in parallel - vertical up/down (scroll)&lt;br /&gt;
* turn the two fingers around (rotate)&lt;br /&gt;
* slide two fingers towards each other (zoom-)&lt;br /&gt;
* slide two fingers apart (zoom+)&lt;br /&gt;
&lt;br /&gt;
When touching the screen with two fingers at the same time, we necessarily see the two points, or are able to extrapolate the position of the second one. This solution can add feature, but will probably be little erratic...&lt;br /&gt;
&lt;br /&gt;
* '''Touchscreen kernel module hacking'''&lt;br /&gt;
&lt;br /&gt;
We may correct the &amp;quot;half distance&amp;quot; phenomenon on double touch: if double touch is detected, then assimilate the cursor as twice further than the first touch. It would allow finer control, but higher instability.&lt;br /&gt;
&lt;br /&gt;
The double touch detection may be implemented in the driver itself, as well as stabilization.&lt;br /&gt;
&lt;br /&gt;
* '''Other detectable behaviours'''&lt;br /&gt;
&lt;br /&gt;
The warping can be used in the 4 diagonals, plus the up/down/right/left cross:&lt;br /&gt;
&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
  - 1            -  - 1          2 -  - 1            -  -      2       -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -             2-  -              -  - 2            -  -      1       -&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
&lt;br /&gt;
It's not double touch, but two sequential presses with a short time in between (~0.5 s)&lt;br /&gt;
&lt;br /&gt;
===Improved virtual keyboard===&lt;br /&gt;
&lt;br /&gt;
One nice idea for virtual input is [http://www.micropp.se/openmoko/ finger-splash]&lt;br /&gt;
&lt;br /&gt;
Yet, optimization does not only apply to the plain one-letter-at-a-time input. We need some sort of T9 (dictionary-based input help). When typing a word, the first letter determines the next possible ones. Therefore, we may let disappear the less-probable following letters. Ex: type an L, there's no way an X follows...&lt;br /&gt;
&lt;br /&gt;
Hints: &lt;br /&gt;
* ZIP's huffmann compression applied to SMSs/mails for detecting the most used characters/words/sentences.&lt;br /&gt;
* html tag-clouds, one-letter tag clouds ; font size proportional to the probability of being used&lt;br /&gt;
&lt;br /&gt;
The most critical point is the initial disposition of the letters, before any letter is typed. We may also want to use horizontal two-parts keyboard (with the neo in hands like a psp..)&lt;br /&gt;
&lt;br /&gt;
The [http://www.strout.net/info/ideas/hexinput.html hexinput] concept is interesting. What about hiding the less probable letters and increasing the remaining ones during typing?&lt;br /&gt;
&lt;br /&gt;
===Towards OpenGL compositing===&lt;br /&gt;
&lt;br /&gt;
There are [http://www.hbmobile.org/wiki/index.php?title=GUI_Frameworks lots of possible GUI frameworks] with various software architectures that could be used for OpenMoko.&lt;br /&gt;
&lt;br /&gt;
GTA01 hardware uses GTK+/matchbox without hardware acceleration, and it's not enough: this is a first that a mobile Linux device has such a high DPI resolution. OpenGL ES compositing seems to have a bright future on embedded devices, because compositing seems to give natural zooming interfaces reality (at last!).&lt;br /&gt;
&lt;br /&gt;
Considering recent changes in destkop applications, opengl has a definite future. For instance, the expose (be it apple's or beryl's) is a very interesting and usable feature. Using compositing allows the physics metaphore: '''the human brain doesn't like &amp;quot;gaps&amp;quot;/jumps (for instance while scrolling a text), it needs continuity''', which can be provided by opengl. When you look at apple's iphone prototype, it's not just eye candy, it's maybe the most natural/human way of navigating, because it's sufficiently realistic for the brain to forget the non-physical nature of what's inside.&lt;br /&gt;
&lt;br /&gt;
So, opengl hardware will be needed in a more or less distant hardware, for 100% fluid operation. Benchmarking will be needed to compare the different alternatives that are cited further.&lt;br /&gt;
&lt;br /&gt;
====Switching to the Enlightenment Foundation Libraries====&lt;br /&gt;
&lt;br /&gt;
Evas is a powerful and power sparing canvas drawing library. It can be OpenGL accelerated. Python/Ruby bindings are available in the &amp;quot;proto&amp;quot; e17 cvs folder.&lt;br /&gt;
&lt;br /&gt;
''Moved [[E17|here]]''&lt;br /&gt;
&lt;br /&gt;
====Clutter Toolkit====&lt;br /&gt;
&lt;br /&gt;
Clutter, an [http://o-hand.com/ OpenedHand] project, is an open source software library for creating fast, visually rich graphical user interfaces. The most obvious example of potential usage is in media center type applications.&lt;br /&gt;
&lt;br /&gt;
http://clutter-project.org/&lt;br /&gt;
&lt;br /&gt;
Clutter uses OpenGL (and optionally '''OpenGL ES''') for rendering but with an API which hides the underlying GL complexity from the developer. The Clutter API is intended to be easy to use, efficient and flexible.&lt;br /&gt;
&lt;br /&gt;
It does integrate gstreamer (for easy media playback, even camera or mic inputs), allows pango text rendering, cairo graphics rendering. Provided bindings are python, C# and Ruby.&lt;br /&gt;
&lt;br /&gt;
GTK off screen rendering is supposed to be on it's way; once it is here, there will be a possibility of using GTK apps directly within OpenGL apps as textures, which would lead to the possibility of creating a full OpenGL &amp;quot;application manager&amp;quot; (as well as media consuming app) with ZUI features.&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C, OpenGL&lt;br /&gt;
* Bindings: Python, C#, Ruby&lt;br /&gt;
* Backends: GLX / SDL / EGL&lt;br /&gt;
* Media support: Gstreamer integration, Cairo graphics rendering, Pango fonts rendering&lt;br /&gt;
* Embedding: GTK embedding&lt;br /&gt;
&lt;br /&gt;
====Graff====&lt;br /&gt;
&lt;br /&gt;
An early demonstration of Graff, which ''is a lighweight high-performance graphics rendering library.''&lt;br /&gt;
http://www.mdk.org.pl/articles/2007/04/23/chapter-1-in-which-we-meet-graff&lt;br /&gt;
&lt;br /&gt;
Be sure to check out this demo (scrolling list with inertia scrolling)&lt;br /&gt;
http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Of course it will remind you of Apple iPhone's UI. But this one runs in software mode on Nokia N770&amp;amp;800 already. The most notable part of Graff seems to be the inertia and physics integration in general.&lt;br /&gt;
&lt;br /&gt;
====Pigment API====&lt;br /&gt;
&lt;br /&gt;
Fluendo's (the Gstreamer guys) ''[https://core.fluendo.com/pigment/trac Pigment] is a Python library designed to easily build user interfaces with embedded multimedia. Its design allows to use it on several platforms, thanks to a plugin system allowing to choose the underlying graphical API. Pigment is the rendering engine of Elisa, the Fluendo Media Center project.''&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C OpenGL Python&lt;br /&gt;
* Bindings: Python&lt;br /&gt;
* Backends: DirectFB OpenGL&lt;br /&gt;
* Media playback integration: using Gstreamer&lt;br /&gt;
&lt;br /&gt;
===Choosing===&lt;br /&gt;
&lt;br /&gt;
Benchmarking will be needed. We have therefore to define a std testing application that would allow to compare alternatives. &lt;br /&gt;
&lt;br /&gt;
Some Clutter VS Pigment information: http://www.taimila.com/?q=node/14&lt;br /&gt;
&lt;br /&gt;
==Improvement ideas==&lt;br /&gt;
&lt;br /&gt;
Please add here any idea that seems of relevance.&lt;br /&gt;
&lt;br /&gt;
===1D list scrolling: looped physics-driven item list===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
&lt;br /&gt;
Take an item list (ex: adress book), print it on a ribbon of paper, and glue it on a wheel (on the tire). You're looking in the front of it, so when you want to go from the A to Z, you touch the wheel and drag it up. When you let the wheel go, it goes furter, taken by it's inertia. Stop the wheel when you got your contact. Got the idea? That's why we may speak of an &amp;quot;infinite wheel&amp;quot;, so that the surface is flat. For our case here, we always want to display square content, so the [http://en.wikipedia.org/wiki/Uniform_prism n-sided uniform prism] analogy is mathematically more exact.&lt;br /&gt;
&lt;br /&gt;
Important features:&lt;br /&gt;
* '''weight''': the biggest the item list, the faster it scrolls; that way, you don't have to wait too long for big lists, and you don't miss your item on shorter lists&lt;br /&gt;
* '''friction''': there is friction where the wheel is fixed, so that the wheel doesn't turn infinitely; more friction on short lists, less on big ones&lt;br /&gt;
* the '''initial speed and acceleration vector''' you give it determines it's futher rotation&lt;br /&gt;
* it's &amp;quot;round&amp;quot;/cyclic, so you can '''browse the list in two directions'''&lt;br /&gt;
* we may want to add a &amp;quot;progression indicator&amp;quot;, ex the current alphabetical letter, with a font size adequate to the proportion of the number of entries in the letter subcategory, or a reduced map of the distribution of the first letters...&lt;br /&gt;
 &lt;br /&gt;
We can add &amp;quot;parallel wheels&amp;quot;, symbolizing different sorting methods. Slide long to the left / right to look at a different wheel = items organization.&lt;br /&gt;
&lt;br /&gt;
====Controls====&lt;br /&gt;
&lt;br /&gt;
* Sliding up/down = Single click + maintained for a minimal distance&lt;br /&gt;
&lt;br /&gt;
Effect: scroll in an inverted/negated fashion (slide down = scroll up, slide up = scroll down)&lt;br /&gt;
&lt;br /&gt;
When finger is released (i.e. touchscreen doesn't detect any press):&lt;br /&gt;
  if (last_speed_seen &amp;gt; 0 ) then keep this speed and acceleration, with friction&lt;br /&gt;
  else stop scrolling&lt;br /&gt;
&lt;br /&gt;
Scrolling here is seen as unidimensional, but can apply to bidimensional situations (ex: zoomed image) too&lt;br /&gt;
&lt;br /&gt;
* Action = quick double tap&lt;br /&gt;
&lt;br /&gt;
* Details/select = short single tap&lt;br /&gt;
&lt;br /&gt;
* Right click = long tap&lt;br /&gt;
&lt;br /&gt;
* Sliding left/right: switch sorting method&lt;br /&gt;
&lt;br /&gt;
====Parts to modify====&lt;br /&gt;
&lt;br /&gt;
''Having a scroll that isn't a 1:1 map to the user's action isn't hard. It's just an extra calculation in the scroll code.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;---- Where is the scroll code? :)&lt;br /&gt;
&lt;br /&gt;
* libmokoui&lt;br /&gt;
** [[Stylus_Scrolling | Stylus scrolling widget]]&lt;br /&gt;
** [[Finger_Scrolling | Finger scrolling wheel widget]]&lt;br /&gt;
* gtk&lt;br /&gt;
** [http://www.gtk.org/api/2.6/gtk/GtkVScrollbar.html GtkVScrollbar]&lt;br /&gt;
&lt;br /&gt;
The best would be to add the feature for both finger and stylus scrolling.&lt;br /&gt;
&lt;br /&gt;
TODO:&lt;br /&gt;
* make the entire list a &amp;quot;scrolling zone&amp;quot;, i.e. an overlay transparent scrolling widget?&lt;br /&gt;
* define controls&lt;br /&gt;
* add the inertia feature&lt;br /&gt;
&lt;br /&gt;
===1D Scrolling: inertia friction integration into openmoko's finger wheel=== &lt;br /&gt;
&lt;br /&gt;
The same, but for the wheel. It can be very short to do: you don't have 1:1 anymore, but, for example, 1/4 wheel turn = 1 item. It's demultiplicated, but has inertia.&lt;br /&gt;
&lt;br /&gt;
===Left-handed UI Support===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
A discussion on the community list identified a desire to have the ability to switch the OpenMoko UI into &amp;quot;left-handed&amp;quot; mode.  &lt;br /&gt;
&lt;br /&gt;
 The main problem is scrollbars, when they're on the right, dragging  &lt;br /&gt;
 the scrollbar left handed results in your hand covering the screen so  &lt;br /&gt;
 you can't see what you are doing. So having the option of scrollbars  &lt;br /&gt;
 on the left would be useful.&lt;br /&gt;
&lt;br /&gt;
 I don't think the whole screen should be mirrored! There are some elements&lt;br /&gt;
 that should remain..like the main top bar with the status icons and such.&lt;br /&gt;
 Scrollbars are the main thing I can think of right now.&lt;br /&gt;
&lt;br /&gt;
===Handgesture recognition proposals===&lt;br /&gt;
&lt;br /&gt;
====Using simple, localized warp as modifier key====&lt;br /&gt;
&lt;br /&gt;
As discussed on community list:&lt;br /&gt;
&lt;br /&gt;
  If you hold down one finger and tap the other one, the mouse pops over and back&lt;br /&gt;
  again. If you keep your second finger touching, the cursor follows it. When you&lt;br /&gt;
  release it, cursor goes back to first finger position. This could be a way to&lt;br /&gt;
  set a bounding box or turn on the mode. So the second finger can do something&lt;br /&gt;
  like rotating around the first, or increase or lower the distance to the first.&lt;br /&gt;
&lt;br /&gt;
* the so-called &amp;quot;first touch&amp;quot; can be done on the mokowheel zone itself: put your left thumb on the black area; if you touch the screen with another finger, there is a '''warp'''; the warp is detectable and allows to enter &amp;quot;fake multi-touchscreen mode&amp;quot;&lt;br /&gt;
* afterwards,&lt;br /&gt;
     * slide your right-hand finger down, it scrolls up&lt;br /&gt;
     * slide your right-hand finger up, it scrolls down&lt;br /&gt;
     * slide it left, next page/item&lt;br /&gt;
     * slide it right, previous page/item&lt;br /&gt;
     * do a circle: rotation&lt;br /&gt;
     * narrow towards the black circle: zoom -&lt;br /&gt;
     * go away: zoom +&lt;br /&gt;
* if you had kept your first finger on the black quarter circle, you can continue issuing other gestures&lt;br /&gt;
&lt;br /&gt;
The advantages of using simple origin-driven cursor warping as double touch detection criteria is that:&lt;br /&gt;
* you don't have to use the wheel as button, which would slow things down and generate errors (false button presses)&lt;br /&gt;
* simpler detection algorithms that can pass by the fluctuation due to pressure relative distribution&lt;br /&gt;
* the space taken by the wheel itself is &amp;quot;useless&amp;quot; (i.e. displays no information); using it as modifier allows to keep the screen clean for reading&lt;br /&gt;
* the origin of this zone lets use maximum surface of the screen, allowing more fine controlling&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_rotate_right.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_previous.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_down.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_zoom-.png]]&lt;br /&gt;
&lt;br /&gt;
*Pros:&lt;br /&gt;
** who said we need multi-touch hardware?&lt;br /&gt;
** this may be the easiest way (in terms of design/implementation complexity, reliability)&lt;br /&gt;
*Cons: &lt;br /&gt;
** no matter what we'll invent, we'll need two hands for on-the-move controlling&lt;br /&gt;
** what about left-handed people?&lt;br /&gt;
&lt;br /&gt;
====What is to modify ?====&lt;br /&gt;
&lt;br /&gt;
We need to emulate key presses. We need to work at a layer where we can get raw cursor coordinates. &amp;lt;---- X server layer?&lt;br /&gt;
&lt;br /&gt;
====Full multi-touch emulation====&lt;br /&gt;
&lt;br /&gt;
Doable, but tricky...&lt;br /&gt;
&lt;br /&gt;
==Open questions==&lt;br /&gt;
&lt;br /&gt;
* will the neo/openmoko graphics system be powerful enough for such uses? I apple uses an OpenGL ES acceleration on this device (as well as on recent iPods), which is on the way with [[GTA02#.22Phase_2.22_.28GTA02.2C_.22Mass_Market.22.29|GTA02]].&lt;br /&gt;
* how does the touchscreen behave? We need a detailed touchscreen wiki information page, with visual traces. How hardware-specific is it?&lt;br /&gt;
* is multi touch really that awesome? I guess not.&lt;br /&gt;
&lt;br /&gt;
{{Languages|UI Improvements}}&lt;br /&gt;
&lt;br /&gt;
[[Category:User Interfaces| ]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/UI_Improvements</id>
		<title>UI Improvements</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/UI_Improvements"/>
				<updated>2007-07-27T16:59:44Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Pigment API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
  Obviously the tools are in the wild to build interfaces that could rival&lt;br /&gt;
  (or better IMO) anything Apple comes up with. We just need to organize&lt;br /&gt;
  this stuff. This would need hardware that can support dynamic&lt;br /&gt;
  interfaces. I can help here, too.&lt;br /&gt;
  sean@openmoko.com&lt;br /&gt;
&lt;br /&gt;
In fact, this place shall be dedicated to human-machine interactions improvements discussion;&lt;br /&gt;
&lt;br /&gt;
Human-machine interaction can be separated into several aspects:&lt;br /&gt;
* the physical contact/input device: the mono-touch touchscreen&lt;br /&gt;
* the graphics: &lt;br /&gt;
** accelerated rendering can add more consistency to zooming user interfaces, which seem to be quite an interesting concept for embedded scrensize-limited devices&lt;br /&gt;
** adding physics &amp;quot;look and feel&amp;quot; to (ex: menu's) behaviours can add coherence too&lt;br /&gt;
* the input methods&lt;br /&gt;
** the virtual keyboard&lt;br /&gt;
** handgestures&lt;br /&gt;
&lt;br /&gt;
==Finding inspiration ...==&lt;br /&gt;
&lt;br /&gt;
===Seen Live===&lt;br /&gt;
&lt;br /&gt;
'''Multi-touch'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=89sz8ExZndc Multi-Touchscreen experiments video @youtube]&lt;br /&gt;
*[http://www.youtube.com/watch?v=nPqqfVLQ_qY iPhone UI features demo @youtube]&lt;br /&gt;
&lt;br /&gt;
'''Zooming user interfaces'''&lt;br /&gt;
*[http://www.zenzui.com/products.html ZenZui], a [http://en.wikipedia.org/wiki/ZUI ZUI (zooming user interface)]&lt;br /&gt;
*[http://labs.live.com/Deepfish/videos.aspx Microsoft Bluefish's ZUI] (new mobile webbrowser)&lt;br /&gt;
*[http://googlesystem.blogspot.com/2007/04/opera-920-more-homepages-at-your.html Opera speed dial]&lt;br /&gt;
&lt;br /&gt;
'''Graphics'''&lt;br /&gt;
*[http://www.rasterman.com/files/eem.avi EEM], Rasterman's EFL libs on handelds proof of concept (doesn't DO anything, just showing off the EFLs on a handeld)&lt;br /&gt;
*[http://www.youtube.com/watch?v=8kLFPfaxQ6U&amp;amp;eurl= Nvidia's cutting-edge techno], an [http://www.khronos.org/openkode/ Openkode] demo.&lt;br /&gt;
&lt;br /&gt;
'''Science fiction'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=G_FS2TiK3AI UPMC Future?]&lt;br /&gt;
&lt;br /&gt;
'''Links:'''&lt;br /&gt;
*[http://elevate.sourceforge.net/links.html elevate project's links] sums up quite greatly the latest innovations in the desktop area&lt;br /&gt;
*[http://nooface.net/ Nooface] is a human-machine news site&lt;br /&gt;
*Asus-Intel's [http://www.hothardware.com/articles/Hands_on_with_the_ASUS_Eee/?page=2 Eee]'s interface&lt;br /&gt;
&lt;br /&gt;
===Clever hacks===&lt;br /&gt;
&lt;br /&gt;
It's been said that having no multitouch screen allows less freedom for innovation. Maybe we could get something out of our touchscreen drivers.&lt;br /&gt;
&lt;br /&gt;
Why ? Think of apple's scroll up/down feature on macbooks touchpads (which '''aren't multi touch''', it's a [http://iscroll2.sourceforge.net/ clever driver hack, iscroll2]):&lt;br /&gt;
&lt;br /&gt;
  To scroll, just place two fingers on your trackpad instead of one. Both fingers&lt;br /&gt;
  need to be placed next to each other horizontally (not vertically, the trackpad &lt;br /&gt;
  cannot detect that). Some people get better results with their finger spaced a&lt;br /&gt;
  little bit apart, while others prefer having the fingers right next to each other.&lt;br /&gt;
&lt;br /&gt;
  iScroll2 provides two scrolling modes: Linear and circular scrolling.&lt;br /&gt;
&lt;br /&gt;
  For linear scrolling, move the two fingers up/down or left/right in a straight &lt;br /&gt;
  line, respectively, to scroll in that direction.&lt;br /&gt;
&lt;br /&gt;
  Circular scrolling works in a way similar to the iPod's scroll wheel: Move the two&lt;br /&gt;
  fingers in a circle to scroll up or down, depending   on whether you move in a &lt;br /&gt;
  clockwise or counterclockwise direction.&lt;br /&gt;
&lt;br /&gt;
Maybe we can port/adapt/get inspiration from this macintosh driver.&lt;br /&gt;
&lt;br /&gt;
===n-D navigation: the polyhedra inspiration===&lt;br /&gt;
&lt;br /&gt;
When we want to navigate files, mp3s in an mp3 player, etc... Every control that the application needs is a button. What about looking at the polyhedrons? We could find one for each usage, with as many surrounding subzones that may be used as controls. Ex: you need 5 buttons, let's take a pentagon with 5 surrounding zones all around. That way, it's always optimized...&lt;br /&gt;
&lt;br /&gt;
http://en.wikipedia.org/wiki/Polyhedra&lt;br /&gt;
http://en.wikipedia.org/wiki/List_of_uniform_polyhedra&lt;br /&gt;
&lt;br /&gt;
===Our weapons===&lt;br /&gt;
&lt;br /&gt;
We can't improve the human-machine interface without knowing the strengths / weaknesses of our hardware; some of the weaknesses might turn out as exploitable features, some strengths as limiting constraints.&lt;br /&gt;
&lt;br /&gt;
====The touchscreen====&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What exactly does the touchscreen see when  you touch the screen with 2 fingers&lt;br /&gt;
  at the same time, when you move them, when you move only one of the 2, etc. I'm &lt;br /&gt;
  also interested in knowing how precise the touchscreen is (ex: refresh rate, &lt;br /&gt;
  possible pressure indication, ...)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* The output is the center of the bounding box of the touched area&lt;br /&gt;
* The touch point skips instantly on double touch&lt;br /&gt;
* Pressure has almost no effect on a single touch, but not so on a double touch. The relative pressures will cause a significant skewing effect towards the harder touch. You can easily move the pointer along the line between your two fingers by changing the relative pressure.&lt;br /&gt;
&lt;br /&gt;
Conclusions:&lt;br /&gt;
* we can detect double touch as jumps, and that's all&lt;br /&gt;
* no pressure&lt;br /&gt;
* This could be an interesting input method for games - e.g. holding the Neo in landscape view, letting each thumb rest on a specific input area; probably needs to be checked for usability with a real device&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when sliding two fingers in parallel up(L,R)-&amp;gt;down(L,R)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see a slide along the center line between your two fingers. In practice, you can't keep the pressure equal, so you will see some kind of zig-zag line somewhere between the two pressure points in the direction of your slide.&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when narrowing two fingers in slide (=zoom effect on iphone)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see the pointer stay at the center of the zoom movement. In practice, you can't keep the pressure equal for both fingers, so the pointer will move towards one of the two pressure points.&lt;br /&gt;
&lt;br /&gt;
====Graphics and computational capabilities====&lt;br /&gt;
&lt;br /&gt;
It would be good to report what performance the current hardware allows:&lt;br /&gt;
* There was no pure X11 benchmarking done (AFAIK) (how many fps at full VGA scrolling, ex: 1024*480 image scrolling?)&lt;br /&gt;
* what about the lcd reactivity? What if we don't see anything but blur while moving items fast?&lt;br /&gt;
&lt;br /&gt;
Please report here your impressions.&lt;br /&gt;
&lt;br /&gt;
==Areas of improvement==&lt;br /&gt;
&lt;br /&gt;
* OpenGL for fluid zooming interfaces (2D: the infinite sphere model, 1D: the infinite wheel of fortune/ribbon model, exposé)&lt;br /&gt;
* HandGestures&lt;br /&gt;
* Physics-model based improvements: inertia and friction&lt;br /&gt;
* multi touch screen for natural handgestures &lt;br /&gt;
* improved virtual keyboard&lt;br /&gt;
* switching to another GUI toolkit (EFLs)&lt;br /&gt;
&lt;br /&gt;
===Physics-inspired animation a.k.a. &amp;quot;Digital Physics&amp;quot;===&lt;br /&gt;
&lt;br /&gt;
If we want to add eye candy &amp;amp; usability to the UI (such as smooth realistic list scrolling, as seen in apple's&lt;br /&gt;
iphone demo on contacts lists for instance), we'll need a physics engine, so that moves &amp;amp; animations aren't all linear.&lt;br /&gt;
&lt;br /&gt;
The following aticle explains the [http://www.readwriteweb.com/archives/the_physics_of_iphone.php Digital Physics] term from the iPhone example.&lt;br /&gt;
&lt;br /&gt;
The most used technique for calculating trajectories and systems of related geometrical objects seems to be [http://en.wikipedia.org/wiki/Verlet_integration verlet integration] implementation; it is an alternative to Euler's integration method, using fast approximation. &lt;br /&gt;
&lt;br /&gt;
We may have no need for such a mathematical method at first, but perhaps there are other use cases. For instance, it may be useful to gesture recognition (i'm not aware if existing gesture recognition engines measure speed, acceleration...).&lt;br /&gt;
&lt;br /&gt;
====Open Dynamics Engine====&lt;br /&gt;
&lt;br /&gt;
ODE is an open source, high performance library for simulating rigid body dynamics. It is fully featured, stable, mature and platform independent with an easy to use C/C++ API. It has advanced joint types and integrated collision detection with friction. ODE is useful for simulating vehicles, objects in virtual reality environments and virtual creatures. It is currently used in many computer games, 3D authoring tools and simulation tools.&lt;br /&gt;
&lt;br /&gt;
http://www.ode.org/&lt;br /&gt;
&lt;br /&gt;
====Libakamaru====&lt;br /&gt;
&lt;br /&gt;
The [http://people.freedesktop.org/~krh/akamaru.git/ akamaru library] is the code behind [http://www.youtube.com/watch?v=VekgyKQoTeM kiba dock]'s fun and dynamic behaviour. It's dependencies are light (needs just GLib). It takes elasticity, friction, gravity into account.&lt;br /&gt;
&lt;br /&gt;
If you want to take a quick look at the code:&lt;br /&gt;
svn co http://svn.kiba-dock.org/akamaru/ akamaru&lt;br /&gt;
&lt;br /&gt;
The only (AFAIK) application using this library is kiba-dock, a *fun* app launcher, but we may find another use to it in the future.&lt;br /&gt;
&lt;br /&gt;
As suggested on the mailing list, it is mostly overkill for the uses we intend to have, but this library may be optimized already, the API can spare some time for too. Furthermore, ''Qui peut le plus, peut le moins''.&lt;br /&gt;
&lt;br /&gt;
====Verlet integration implementation from e17====&lt;br /&gt;
&lt;br /&gt;
There's an undergoing verlet integration implementation into the e17 project (by rephorm) see http://rephorm.com/news/tag/physics , so we may see some UI physics integration into e17 someday.&lt;br /&gt;
&lt;br /&gt;
====Robert Pernner's easy equations====&lt;br /&gt;
&lt;br /&gt;
http://www.robertpenner.com/easing/&lt;br /&gt;
&lt;br /&gt;
See the demo: implements non linear behaviour (actionscript), but may give inspiration&lt;br /&gt;
&lt;br /&gt;
===Extending the touchscreen capabilities and input methods===&lt;br /&gt;
&lt;br /&gt;
* '''Multitouchscreen emulation'''&lt;br /&gt;
&lt;br /&gt;
If we got it right, when touching the screen on a second place, the cursor oscillates between the two points depending on relative pressure distribution. Using averaging algorithms, we may have the opportunity to detect peculiar behaviours.&lt;br /&gt;
&lt;br /&gt;
We need raw data (x,y,t) from the real hardware for the following behaviours:&lt;br /&gt;
* slide two fingers in parallel - vertical up/down (scroll)&lt;br /&gt;
* turn the two fingers around (rotate)&lt;br /&gt;
* slide two fingers towards each other (zoom-)&lt;br /&gt;
* slide two fingers apart (zoom+)&lt;br /&gt;
&lt;br /&gt;
When touching the screen with two fingers at the same time, we necessarily see the two points, or are able to extrapolate the position of the second one. This solution can add feature, but will probably be little erratic...&lt;br /&gt;
&lt;br /&gt;
* '''Touchscreen kernel module hacking'''&lt;br /&gt;
&lt;br /&gt;
We may correct the &amp;quot;half distance&amp;quot; phenomenon on double touch: if double touch is detected, then assimilate the cursor as twice further than the first touch. It would allow finer control, but higher instability.&lt;br /&gt;
&lt;br /&gt;
The double touch detection may be implemented in the driver itself, as well as stabilization.&lt;br /&gt;
&lt;br /&gt;
* '''Other detectable behaviours'''&lt;br /&gt;
&lt;br /&gt;
The warping can be used in the 4 diagonals, plus the up/down/right/left cross:&lt;br /&gt;
&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
  - 1            -  - 1          2 -  - 1            -  -      2       -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -             2-  -              -  - 2            -  -      1       -&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
&lt;br /&gt;
It's not double touch, but two sequential presses with a short time in between (~0.5 s)&lt;br /&gt;
&lt;br /&gt;
===Improved virtual keyboard===&lt;br /&gt;
&lt;br /&gt;
One nice idea for virtual input is [http://www.micropp.se/openmoko/ finger-splash]&lt;br /&gt;
&lt;br /&gt;
Yet, optimization does not only apply to the plain one-letter-at-a-time input. We need some sort of T9 (dictionary-based input help). When typing a word, the first letter determines the next possible ones. Therefore, we may let disappear the less-probable following letters. Ex: type an L, there's no way an X follows...&lt;br /&gt;
&lt;br /&gt;
Hints: &lt;br /&gt;
* ZIP's huffmann compression applied to SMSs/mails for detecting the most used characters/words/sentences.&lt;br /&gt;
* html tag-clouds, one-letter tag clouds ; font size proportional to the probability of being used&lt;br /&gt;
&lt;br /&gt;
The most critical point is the initial disposition of the letters, before any letter is typed. We may also want to use horizontal two-parts keyboard (with the neo in hands like a psp..)&lt;br /&gt;
&lt;br /&gt;
The [http://www.strout.net/info/ideas/hexinput.html hexinput] concept is interesting. What about hiding the less probable letters and increasing the remaining ones during typing?&lt;br /&gt;
&lt;br /&gt;
===Towards OpenGL compositing===&lt;br /&gt;
&lt;br /&gt;
There are [http://www.hbmobile.org/wiki/index.php?title=GUI_Frameworks lots of possible GUI frameworks] with various software architectures that could be used for OpenMoko.&lt;br /&gt;
&lt;br /&gt;
GTA01 hardware uses GTK+/matchbox without hardware acceleration, and it's not enough: this is a first that a mobile Linux device has such a high DPI resolution. OpenGL ES compositing seems to have a bright future on embedded devices, because compositing seems to give natural zooming interfaces reality (at last!).&lt;br /&gt;
&lt;br /&gt;
Considering recent changes in destkop applications, opengl has a definite future. For instance, the expose (be it apple's or beryl's) is a very interesting and usable feature. Using compositing allows the physics metaphore: '''the human brain doesn't like &amp;quot;gaps&amp;quot;/jumps (for instance while scrolling a text), it needs continuity''', which can be provided by opengl. When you look at apple's iphone prototype, it's not just eye candy, it's maybe the most natural/human way of navigating, because it's sufficiently realistic for the brain to forget the non-physical nature of what's inside.&lt;br /&gt;
&lt;br /&gt;
So, opengl hardware will be needed in a more or less distant hardware, for 100% fluid operation. Benchmarking will be needed to compare the different alternatives that are cited further.&lt;br /&gt;
&lt;br /&gt;
====Switching to the Enlightenment Foundation Libraries====&lt;br /&gt;
&lt;br /&gt;
Evas is a powerful and power sparing canvas drawing library. It can be OpenGL accelerated. Python/Ruby bindings are available in the &amp;quot;proto&amp;quot; e17 cvs folder.&lt;br /&gt;
&lt;br /&gt;
''Moved [[E17|here]]''&lt;br /&gt;
&lt;br /&gt;
====Clutter Toolkit====&lt;br /&gt;
&lt;br /&gt;
Clutter, an [http://o-hand.com/ OpenedHand] project, is an open source software library for creating fast, visually rich graphical user interfaces. The most obvious example of potential usage is in media center type applications.&lt;br /&gt;
&lt;br /&gt;
http://clutter-project.org/&lt;br /&gt;
&lt;br /&gt;
Clutter uses OpenGL (and optionally '''OpenGL ES''') for rendering but with an API which hides the underlying GL complexity from the developer. The Clutter API is intended to be easy to use, efficient and flexible.&lt;br /&gt;
&lt;br /&gt;
It does integrate gstreamer (for easy media playback, even camera or mic inputs), allows pango text rendering, cairo graphics rendering. Provided bindings are python, C# and Ruby.&lt;br /&gt;
&lt;br /&gt;
GTK off screen rendering is supposed to be on it's way; once it is here, there will be a possibility of using GTK apps directly within OpenGL apps as textures, which would lead to the possibility of creating a full OpenGL &amp;quot;application manager&amp;quot; (as well as media consuming app) with ZUI features.&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C, OpenGL&lt;br /&gt;
* Bindings: Python, C#, Ruby&lt;br /&gt;
* Backends: GLX / SDL / EGL&lt;br /&gt;
* Media support: Gstreamer integration, Cairo graphics rendering, Pango fonts rendering&lt;br /&gt;
* Embedding: GTK embedding&lt;br /&gt;
&lt;br /&gt;
====Graff====&lt;br /&gt;
&lt;br /&gt;
An early demonstration of Graff, which ''is a lighweight high-performance graphics rendering library.''&lt;br /&gt;
http://www.mdk.org.pl/articles/2007/04/23/chapter-1-in-which-we-meet-graff&lt;br /&gt;
&lt;br /&gt;
Be sure to check out this demo (scrolling list with inertia scrolling)&lt;br /&gt;
http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Of course it will remind you of Apple iPhone's UI. But this one runs in software mode on Nokia N770&amp;amp;800 already. The most notable part of Graff seems to be the inertia and physics integration in general.&lt;br /&gt;
&lt;br /&gt;
====Pigment API====&lt;br /&gt;
&lt;br /&gt;
Fluendo's (the Gstreamer guys) ''[https://core.fluendo.com/pigment/trac Pigment] is a Python library designed to easily build user interfaces with embedded multimedia. Its design allows to use it on several platforms, thanks to a plugin system allowing to choose the underlying graphical API. Pigment is the rendering engine of Elisa, the Fluendo Media Center project.''&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C OpenGL Python&lt;br /&gt;
* Bindings: Python&lt;br /&gt;
* Backends: DirectFB OpenGL&lt;br /&gt;
&lt;br /&gt;
===Choosing===&lt;br /&gt;
&lt;br /&gt;
Benchmarking will be needed. We have therefore to define a std testing application that would allow to compare alternatives. &lt;br /&gt;
&lt;br /&gt;
Some Clutter VS Pigment information: http://www.taimila.com/?q=node/14&lt;br /&gt;
&lt;br /&gt;
==Improvement ideas==&lt;br /&gt;
&lt;br /&gt;
Please add here any idea that seems of relevance.&lt;br /&gt;
&lt;br /&gt;
===1D list scrolling: looped physics-driven item list===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
&lt;br /&gt;
Take an item list (ex: adress book), print it on a ribbon of paper, and glue it on a wheel (on the tire). You're looking in the front of it, so when you want to go from the A to Z, you touch the wheel and drag it up. When you let the wheel go, it goes furter, taken by it's inertia. Stop the wheel when you got your contact. Got the idea? That's why we may speak of an &amp;quot;infinite wheel&amp;quot;, so that the surface is flat. For our case here, we always want to display square content, so the [http://en.wikipedia.org/wiki/Uniform_prism n-sided uniform prism] analogy is mathematically more exact.&lt;br /&gt;
&lt;br /&gt;
Important features:&lt;br /&gt;
* '''weight''': the biggest the item list, the faster it scrolls; that way, you don't have to wait too long for big lists, and you don't miss your item on shorter lists&lt;br /&gt;
* '''friction''': there is friction where the wheel is fixed, so that the wheel doesn't turn infinitely; more friction on short lists, less on big ones&lt;br /&gt;
* the '''initial speed and acceleration vector''' you give it determines it's futher rotation&lt;br /&gt;
* it's &amp;quot;round&amp;quot;/cyclic, so you can '''browse the list in two directions'''&lt;br /&gt;
* we may want to add a &amp;quot;progression indicator&amp;quot;, ex the current alphabetical letter, with a font size adequate to the proportion of the number of entries in the letter subcategory, or a reduced map of the distribution of the first letters...&lt;br /&gt;
 &lt;br /&gt;
We can add &amp;quot;parallel wheels&amp;quot;, symbolizing different sorting methods. Slide long to the left / right to look at a different wheel = items organization.&lt;br /&gt;
&lt;br /&gt;
====Controls====&lt;br /&gt;
&lt;br /&gt;
* Sliding up/down = Single click + maintained for a minimal distance&lt;br /&gt;
&lt;br /&gt;
Effect: scroll in an inverted/negated fashion (slide down = scroll up, slide up = scroll down)&lt;br /&gt;
&lt;br /&gt;
When finger is released (i.e. touchscreen doesn't detect any press):&lt;br /&gt;
  if (last_speed_seen &amp;gt; 0 ) then keep this speed and acceleration, with friction&lt;br /&gt;
  else stop scrolling&lt;br /&gt;
&lt;br /&gt;
Scrolling here is seen as unidimensional, but can apply to bidimensional situations (ex: zoomed image) too&lt;br /&gt;
&lt;br /&gt;
* Action = quick double tap&lt;br /&gt;
&lt;br /&gt;
* Details/select = short single tap&lt;br /&gt;
&lt;br /&gt;
* Right click = long tap&lt;br /&gt;
&lt;br /&gt;
* Sliding left/right: switch sorting method&lt;br /&gt;
&lt;br /&gt;
====Parts to modify====&lt;br /&gt;
&lt;br /&gt;
''Having a scroll that isn't a 1:1 map to the user's action isn't hard. It's just an extra calculation in the scroll code.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;---- Where is the scroll code? :)&lt;br /&gt;
&lt;br /&gt;
* libmokoui&lt;br /&gt;
** [[Stylus_Scrolling | Stylus scrolling widget]]&lt;br /&gt;
** [[Finger_Scrolling | Finger scrolling wheel widget]]&lt;br /&gt;
* gtk&lt;br /&gt;
** [http://www.gtk.org/api/2.6/gtk/GtkVScrollbar.html GtkVScrollbar]&lt;br /&gt;
&lt;br /&gt;
The best would be to add the feature for both finger and stylus scrolling.&lt;br /&gt;
&lt;br /&gt;
TODO:&lt;br /&gt;
* make the entire list a &amp;quot;scrolling zone&amp;quot;, i.e. an overlay transparent scrolling widget?&lt;br /&gt;
* define controls&lt;br /&gt;
* add the inertia feature&lt;br /&gt;
&lt;br /&gt;
===1D Scrolling: inertia friction integration into openmoko's finger wheel=== &lt;br /&gt;
&lt;br /&gt;
The same, but for the wheel. It can be very short to do: you don't have 1:1 anymore, but, for example, 1/4 wheel turn = 1 item. It's demultiplicated, but has inertia.&lt;br /&gt;
&lt;br /&gt;
===Left-handed UI Support===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
A discussion on the community list identified a desire to have the ability to switch the OpenMoko UI into &amp;quot;left-handed&amp;quot; mode.  &lt;br /&gt;
&lt;br /&gt;
 The main problem is scrollbars, when they're on the right, dragging  &lt;br /&gt;
 the scrollbar left handed results in your hand covering the screen so  &lt;br /&gt;
 you can't see what you are doing. So having the option of scrollbars  &lt;br /&gt;
 on the left would be useful.&lt;br /&gt;
&lt;br /&gt;
 I don't think the whole screen should be mirrored! There are some elements&lt;br /&gt;
 that should remain..like the main top bar with the status icons and such.&lt;br /&gt;
 Scrollbars are the main thing I can think of right now.&lt;br /&gt;
&lt;br /&gt;
===Handgesture recognition proposals===&lt;br /&gt;
&lt;br /&gt;
====Using simple, localized warp as modifier key====&lt;br /&gt;
&lt;br /&gt;
As discussed on community list:&lt;br /&gt;
&lt;br /&gt;
  If you hold down one finger and tap the other one, the mouse pops over and back&lt;br /&gt;
  again. If you keep your second finger touching, the cursor follows it. When you&lt;br /&gt;
  release it, cursor goes back to first finger position. This could be a way to&lt;br /&gt;
  set a bounding box or turn on the mode. So the second finger can do something&lt;br /&gt;
  like rotating around the first, or increase or lower the distance to the first.&lt;br /&gt;
&lt;br /&gt;
* the so-called &amp;quot;first touch&amp;quot; can be done on the mokowheel zone itself: put your left thumb on the black area; if you touch the screen with another finger, there is a '''warp'''; the warp is detectable and allows to enter &amp;quot;fake multi-touchscreen mode&amp;quot;&lt;br /&gt;
* afterwards,&lt;br /&gt;
     * slide your right-hand finger down, it scrolls up&lt;br /&gt;
     * slide your right-hand finger up, it scrolls down&lt;br /&gt;
     * slide it left, next page/item&lt;br /&gt;
     * slide it right, previous page/item&lt;br /&gt;
     * do a circle: rotation&lt;br /&gt;
     * narrow towards the black circle: zoom -&lt;br /&gt;
     * go away: zoom +&lt;br /&gt;
* if you had kept your first finger on the black quarter circle, you can continue issuing other gestures&lt;br /&gt;
&lt;br /&gt;
The advantages of using simple origin-driven cursor warping as double touch detection criteria is that:&lt;br /&gt;
* you don't have to use the wheel as button, which would slow things down and generate errors (false button presses)&lt;br /&gt;
* simpler detection algorithms that can pass by the fluctuation due to pressure relative distribution&lt;br /&gt;
* the space taken by the wheel itself is &amp;quot;useless&amp;quot; (i.e. displays no information); using it as modifier allows to keep the screen clean for reading&lt;br /&gt;
* the origin of this zone lets use maximum surface of the screen, allowing more fine controlling&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_rotate_right.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_previous.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_down.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_zoom-.png]]&lt;br /&gt;
&lt;br /&gt;
*Pros:&lt;br /&gt;
** who said we need multi-touch hardware?&lt;br /&gt;
** this may be the easiest way (in terms of design/implementation complexity, reliability)&lt;br /&gt;
*Cons: &lt;br /&gt;
** no matter what we'll invent, we'll need two hands for on-the-move controlling&lt;br /&gt;
** what about left-handed people?&lt;br /&gt;
&lt;br /&gt;
====What is to modify ?====&lt;br /&gt;
&lt;br /&gt;
We need to emulate key presses. We need to work at a layer where we can get raw cursor coordinates. &amp;lt;---- X server layer?&lt;br /&gt;
&lt;br /&gt;
====Full multi-touch emulation====&lt;br /&gt;
&lt;br /&gt;
Doable, but tricky...&lt;br /&gt;
&lt;br /&gt;
==Open questions==&lt;br /&gt;
&lt;br /&gt;
* will the neo/openmoko graphics system be powerful enough for such uses? I apple uses an OpenGL ES acceleration on this device (as well as on recent iPods), which is on the way with [[GTA02#.22Phase_2.22_.28GTA02.2C_.22Mass_Market.22.29|GTA02]].&lt;br /&gt;
* how does the touchscreen behave? We need a detailed touchscreen wiki information page, with visual traces. How hardware-specific is it?&lt;br /&gt;
* is multi touch really that awesome? I guess not.&lt;br /&gt;
&lt;br /&gt;
{{Languages|UI Improvements}}&lt;br /&gt;
&lt;br /&gt;
[[Category:User Interfaces| ]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/UI_Improvements</id>
		<title>UI Improvements</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/UI_Improvements"/>
				<updated>2007-07-27T16:59:06Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Clutter Toolkit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
  Obviously the tools are in the wild to build interfaces that could rival&lt;br /&gt;
  (or better IMO) anything Apple comes up with. We just need to organize&lt;br /&gt;
  this stuff. This would need hardware that can support dynamic&lt;br /&gt;
  interfaces. I can help here, too.&lt;br /&gt;
  sean@openmoko.com&lt;br /&gt;
&lt;br /&gt;
In fact, this place shall be dedicated to human-machine interactions improvements discussion;&lt;br /&gt;
&lt;br /&gt;
Human-machine interaction can be separated into several aspects:&lt;br /&gt;
* the physical contact/input device: the mono-touch touchscreen&lt;br /&gt;
* the graphics: &lt;br /&gt;
** accelerated rendering can add more consistency to zooming user interfaces, which seem to be quite an interesting concept for embedded scrensize-limited devices&lt;br /&gt;
** adding physics &amp;quot;look and feel&amp;quot; to (ex: menu's) behaviours can add coherence too&lt;br /&gt;
* the input methods&lt;br /&gt;
** the virtual keyboard&lt;br /&gt;
** handgestures&lt;br /&gt;
&lt;br /&gt;
==Finding inspiration ...==&lt;br /&gt;
&lt;br /&gt;
===Seen Live===&lt;br /&gt;
&lt;br /&gt;
'''Multi-touch'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=89sz8ExZndc Multi-Touchscreen experiments video @youtube]&lt;br /&gt;
*[http://www.youtube.com/watch?v=nPqqfVLQ_qY iPhone UI features demo @youtube]&lt;br /&gt;
&lt;br /&gt;
'''Zooming user interfaces'''&lt;br /&gt;
*[http://www.zenzui.com/products.html ZenZui], a [http://en.wikipedia.org/wiki/ZUI ZUI (zooming user interface)]&lt;br /&gt;
*[http://labs.live.com/Deepfish/videos.aspx Microsoft Bluefish's ZUI] (new mobile webbrowser)&lt;br /&gt;
*[http://googlesystem.blogspot.com/2007/04/opera-920-more-homepages-at-your.html Opera speed dial]&lt;br /&gt;
&lt;br /&gt;
'''Graphics'''&lt;br /&gt;
*[http://www.rasterman.com/files/eem.avi EEM], Rasterman's EFL libs on handelds proof of concept (doesn't DO anything, just showing off the EFLs on a handeld)&lt;br /&gt;
*[http://www.youtube.com/watch?v=8kLFPfaxQ6U&amp;amp;eurl= Nvidia's cutting-edge techno], an [http://www.khronos.org/openkode/ Openkode] demo.&lt;br /&gt;
&lt;br /&gt;
'''Science fiction'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=G_FS2TiK3AI UPMC Future?]&lt;br /&gt;
&lt;br /&gt;
'''Links:'''&lt;br /&gt;
*[http://elevate.sourceforge.net/links.html elevate project's links] sums up quite greatly the latest innovations in the desktop area&lt;br /&gt;
*[http://nooface.net/ Nooface] is a human-machine news site&lt;br /&gt;
*Asus-Intel's [http://www.hothardware.com/articles/Hands_on_with_the_ASUS_Eee/?page=2 Eee]'s interface&lt;br /&gt;
&lt;br /&gt;
===Clever hacks===&lt;br /&gt;
&lt;br /&gt;
It's been said that having no multitouch screen allows less freedom for innovation. Maybe we could get something out of our touchscreen drivers.&lt;br /&gt;
&lt;br /&gt;
Why ? Think of apple's scroll up/down feature on macbooks touchpads (which '''aren't multi touch''', it's a [http://iscroll2.sourceforge.net/ clever driver hack, iscroll2]):&lt;br /&gt;
&lt;br /&gt;
  To scroll, just place two fingers on your trackpad instead of one. Both fingers&lt;br /&gt;
  need to be placed next to each other horizontally (not vertically, the trackpad &lt;br /&gt;
  cannot detect that). Some people get better results with their finger spaced a&lt;br /&gt;
  little bit apart, while others prefer having the fingers right next to each other.&lt;br /&gt;
&lt;br /&gt;
  iScroll2 provides two scrolling modes: Linear and circular scrolling.&lt;br /&gt;
&lt;br /&gt;
  For linear scrolling, move the two fingers up/down or left/right in a straight &lt;br /&gt;
  line, respectively, to scroll in that direction.&lt;br /&gt;
&lt;br /&gt;
  Circular scrolling works in a way similar to the iPod's scroll wheel: Move the two&lt;br /&gt;
  fingers in a circle to scroll up or down, depending   on whether you move in a &lt;br /&gt;
  clockwise or counterclockwise direction.&lt;br /&gt;
&lt;br /&gt;
Maybe we can port/adapt/get inspiration from this macintosh driver.&lt;br /&gt;
&lt;br /&gt;
===n-D navigation: the polyhedra inspiration===&lt;br /&gt;
&lt;br /&gt;
When we want to navigate files, mp3s in an mp3 player, etc... Every control that the application needs is a button. What about looking at the polyhedrons? We could find one for each usage, with as many surrounding subzones that may be used as controls. Ex: you need 5 buttons, let's take a pentagon with 5 surrounding zones all around. That way, it's always optimized...&lt;br /&gt;
&lt;br /&gt;
http://en.wikipedia.org/wiki/Polyhedra&lt;br /&gt;
http://en.wikipedia.org/wiki/List_of_uniform_polyhedra&lt;br /&gt;
&lt;br /&gt;
===Our weapons===&lt;br /&gt;
&lt;br /&gt;
We can't improve the human-machine interface without knowing the strengths / weaknesses of our hardware; some of the weaknesses might turn out as exploitable features, some strengths as limiting constraints.&lt;br /&gt;
&lt;br /&gt;
====The touchscreen====&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What exactly does the touchscreen see when  you touch the screen with 2 fingers&lt;br /&gt;
  at the same time, when you move them, when you move only one of the 2, etc. I'm &lt;br /&gt;
  also interested in knowing how precise the touchscreen is (ex: refresh rate, &lt;br /&gt;
  possible pressure indication, ...)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* The output is the center of the bounding box of the touched area&lt;br /&gt;
* The touch point skips instantly on double touch&lt;br /&gt;
* Pressure has almost no effect on a single touch, but not so on a double touch. The relative pressures will cause a significant skewing effect towards the harder touch. You can easily move the pointer along the line between your two fingers by changing the relative pressure.&lt;br /&gt;
&lt;br /&gt;
Conclusions:&lt;br /&gt;
* we can detect double touch as jumps, and that's all&lt;br /&gt;
* no pressure&lt;br /&gt;
* This could be an interesting input method for games - e.g. holding the Neo in landscape view, letting each thumb rest on a specific input area; probably needs to be checked for usability with a real device&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when sliding two fingers in parallel up(L,R)-&amp;gt;down(L,R)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see a slide along the center line between your two fingers. In practice, you can't keep the pressure equal, so you will see some kind of zig-zag line somewhere between the two pressure points in the direction of your slide.&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when narrowing two fingers in slide (=zoom effect on iphone)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see the pointer stay at the center of the zoom movement. In practice, you can't keep the pressure equal for both fingers, so the pointer will move towards one of the two pressure points.&lt;br /&gt;
&lt;br /&gt;
====Graphics and computational capabilities====&lt;br /&gt;
&lt;br /&gt;
It would be good to report what performance the current hardware allows:&lt;br /&gt;
* There was no pure X11 benchmarking done (AFAIK) (how many fps at full VGA scrolling, ex: 1024*480 image scrolling?)&lt;br /&gt;
* what about the lcd reactivity? What if we don't see anything but blur while moving items fast?&lt;br /&gt;
&lt;br /&gt;
Please report here your impressions.&lt;br /&gt;
&lt;br /&gt;
==Areas of improvement==&lt;br /&gt;
&lt;br /&gt;
* OpenGL for fluid zooming interfaces (2D: the infinite sphere model, 1D: the infinite wheel of fortune/ribbon model, exposé)&lt;br /&gt;
* HandGestures&lt;br /&gt;
* Physics-model based improvements: inertia and friction&lt;br /&gt;
* multi touch screen for natural handgestures &lt;br /&gt;
* improved virtual keyboard&lt;br /&gt;
* switching to another GUI toolkit (EFLs)&lt;br /&gt;
&lt;br /&gt;
===Physics-inspired animation a.k.a. &amp;quot;Digital Physics&amp;quot;===&lt;br /&gt;
&lt;br /&gt;
If we want to add eye candy &amp;amp; usability to the UI (such as smooth realistic list scrolling, as seen in apple's&lt;br /&gt;
iphone demo on contacts lists for instance), we'll need a physics engine, so that moves &amp;amp; animations aren't all linear.&lt;br /&gt;
&lt;br /&gt;
The following aticle explains the [http://www.readwriteweb.com/archives/the_physics_of_iphone.php Digital Physics] term from the iPhone example.&lt;br /&gt;
&lt;br /&gt;
The most used technique for calculating trajectories and systems of related geometrical objects seems to be [http://en.wikipedia.org/wiki/Verlet_integration verlet integration] implementation; it is an alternative to Euler's integration method, using fast approximation. &lt;br /&gt;
&lt;br /&gt;
We may have no need for such a mathematical method at first, but perhaps there are other use cases. For instance, it may be useful to gesture recognition (i'm not aware if existing gesture recognition engines measure speed, acceleration...).&lt;br /&gt;
&lt;br /&gt;
====Open Dynamics Engine====&lt;br /&gt;
&lt;br /&gt;
ODE is an open source, high performance library for simulating rigid body dynamics. It is fully featured, stable, mature and platform independent with an easy to use C/C++ API. It has advanced joint types and integrated collision detection with friction. ODE is useful for simulating vehicles, objects in virtual reality environments and virtual creatures. It is currently used in many computer games, 3D authoring tools and simulation tools.&lt;br /&gt;
&lt;br /&gt;
http://www.ode.org/&lt;br /&gt;
&lt;br /&gt;
====Libakamaru====&lt;br /&gt;
&lt;br /&gt;
The [http://people.freedesktop.org/~krh/akamaru.git/ akamaru library] is the code behind [http://www.youtube.com/watch?v=VekgyKQoTeM kiba dock]'s fun and dynamic behaviour. It's dependencies are light (needs just GLib). It takes elasticity, friction, gravity into account.&lt;br /&gt;
&lt;br /&gt;
If you want to take a quick look at the code:&lt;br /&gt;
svn co http://svn.kiba-dock.org/akamaru/ akamaru&lt;br /&gt;
&lt;br /&gt;
The only (AFAIK) application using this library is kiba-dock, a *fun* app launcher, but we may find another use to it in the future.&lt;br /&gt;
&lt;br /&gt;
As suggested on the mailing list, it is mostly overkill for the uses we intend to have, but this library may be optimized already, the API can spare some time for too. Furthermore, ''Qui peut le plus, peut le moins''.&lt;br /&gt;
&lt;br /&gt;
====Verlet integration implementation from e17====&lt;br /&gt;
&lt;br /&gt;
There's an undergoing verlet integration implementation into the e17 project (by rephorm) see http://rephorm.com/news/tag/physics , so we may see some UI physics integration into e17 someday.&lt;br /&gt;
&lt;br /&gt;
====Robert Pernner's easy equations====&lt;br /&gt;
&lt;br /&gt;
http://www.robertpenner.com/easing/&lt;br /&gt;
&lt;br /&gt;
See the demo: implements non linear behaviour (actionscript), but may give inspiration&lt;br /&gt;
&lt;br /&gt;
===Extending the touchscreen capabilities and input methods===&lt;br /&gt;
&lt;br /&gt;
* '''Multitouchscreen emulation'''&lt;br /&gt;
&lt;br /&gt;
If we got it right, when touching the screen on a second place, the cursor oscillates between the two points depending on relative pressure distribution. Using averaging algorithms, we may have the opportunity to detect peculiar behaviours.&lt;br /&gt;
&lt;br /&gt;
We need raw data (x,y,t) from the real hardware for the following behaviours:&lt;br /&gt;
* slide two fingers in parallel - vertical up/down (scroll)&lt;br /&gt;
* turn the two fingers around (rotate)&lt;br /&gt;
* slide two fingers towards each other (zoom-)&lt;br /&gt;
* slide two fingers apart (zoom+)&lt;br /&gt;
&lt;br /&gt;
When touching the screen with two fingers at the same time, we necessarily see the two points, or are able to extrapolate the position of the second one. This solution can add feature, but will probably be little erratic...&lt;br /&gt;
&lt;br /&gt;
* '''Touchscreen kernel module hacking'''&lt;br /&gt;
&lt;br /&gt;
We may correct the &amp;quot;half distance&amp;quot; phenomenon on double touch: if double touch is detected, then assimilate the cursor as twice further than the first touch. It would allow finer control, but higher instability.&lt;br /&gt;
&lt;br /&gt;
The double touch detection may be implemented in the driver itself, as well as stabilization.&lt;br /&gt;
&lt;br /&gt;
* '''Other detectable behaviours'''&lt;br /&gt;
&lt;br /&gt;
The warping can be used in the 4 diagonals, plus the up/down/right/left cross:&lt;br /&gt;
&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
  - 1            -  - 1          2 -  - 1            -  -      2       -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -             2-  -              -  - 2            -  -      1       -&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
&lt;br /&gt;
It's not double touch, but two sequential presses with a short time in between (~0.5 s)&lt;br /&gt;
&lt;br /&gt;
===Improved virtual keyboard===&lt;br /&gt;
&lt;br /&gt;
One nice idea for virtual input is [http://www.micropp.se/openmoko/ finger-splash]&lt;br /&gt;
&lt;br /&gt;
Yet, optimization does not only apply to the plain one-letter-at-a-time input. We need some sort of T9 (dictionary-based input help). When typing a word, the first letter determines the next possible ones. Therefore, we may let disappear the less-probable following letters. Ex: type an L, there's no way an X follows...&lt;br /&gt;
&lt;br /&gt;
Hints: &lt;br /&gt;
* ZIP's huffmann compression applied to SMSs/mails for detecting the most used characters/words/sentences.&lt;br /&gt;
* html tag-clouds, one-letter tag clouds ; font size proportional to the probability of being used&lt;br /&gt;
&lt;br /&gt;
The most critical point is the initial disposition of the letters, before any letter is typed. We may also want to use horizontal two-parts keyboard (with the neo in hands like a psp..)&lt;br /&gt;
&lt;br /&gt;
The [http://www.strout.net/info/ideas/hexinput.html hexinput] concept is interesting. What about hiding the less probable letters and increasing the remaining ones during typing?&lt;br /&gt;
&lt;br /&gt;
===Towards OpenGL compositing===&lt;br /&gt;
&lt;br /&gt;
There are [http://www.hbmobile.org/wiki/index.php?title=GUI_Frameworks lots of possible GUI frameworks] with various software architectures that could be used for OpenMoko.&lt;br /&gt;
&lt;br /&gt;
GTA01 hardware uses GTK+/matchbox without hardware acceleration, and it's not enough: this is a first that a mobile Linux device has such a high DPI resolution. OpenGL ES compositing seems to have a bright future on embedded devices, because compositing seems to give natural zooming interfaces reality (at last!).&lt;br /&gt;
&lt;br /&gt;
Considering recent changes in destkop applications, opengl has a definite future. For instance, the expose (be it apple's or beryl's) is a very interesting and usable feature. Using compositing allows the physics metaphore: '''the human brain doesn't like &amp;quot;gaps&amp;quot;/jumps (for instance while scrolling a text), it needs continuity''', which can be provided by opengl. When you look at apple's iphone prototype, it's not just eye candy, it's maybe the most natural/human way of navigating, because it's sufficiently realistic for the brain to forget the non-physical nature of what's inside.&lt;br /&gt;
&lt;br /&gt;
So, opengl hardware will be needed in a more or less distant hardware, for 100% fluid operation. Benchmarking will be needed to compare the different alternatives that are cited further.&lt;br /&gt;
&lt;br /&gt;
====Switching to the Enlightenment Foundation Libraries====&lt;br /&gt;
&lt;br /&gt;
Evas is a powerful and power sparing canvas drawing library. It can be OpenGL accelerated. Python/Ruby bindings are available in the &amp;quot;proto&amp;quot; e17 cvs folder.&lt;br /&gt;
&lt;br /&gt;
''Moved [[E17|here]]''&lt;br /&gt;
&lt;br /&gt;
====Clutter Toolkit====&lt;br /&gt;
&lt;br /&gt;
Clutter, an [http://o-hand.com/ OpenedHand] project, is an open source software library for creating fast, visually rich graphical user interfaces. The most obvious example of potential usage is in media center type applications.&lt;br /&gt;
&lt;br /&gt;
http://clutter-project.org/&lt;br /&gt;
&lt;br /&gt;
Clutter uses OpenGL (and optionally '''OpenGL ES''') for rendering but with an API which hides the underlying GL complexity from the developer. The Clutter API is intended to be easy to use, efficient and flexible.&lt;br /&gt;
&lt;br /&gt;
It does integrate gstreamer (for easy media playback, even camera or mic inputs), allows pango text rendering, cairo graphics rendering. Provided bindings are python, C# and Ruby.&lt;br /&gt;
&lt;br /&gt;
GTK off screen rendering is supposed to be on it's way; once it is here, there will be a possibility of using GTK apps directly within OpenGL apps as textures, which would lead to the possibility of creating a full OpenGL &amp;quot;application manager&amp;quot; (as well as media consuming app) with ZUI features.&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core languages: C, OpenGL&lt;br /&gt;
* Bindings: Python, C#, Ruby&lt;br /&gt;
* Backends: GLX / SDL / EGL&lt;br /&gt;
* Media support: Gstreamer integration, Cairo graphics rendering, Pango fonts rendering&lt;br /&gt;
* Embedding: GTK embedding&lt;br /&gt;
&lt;br /&gt;
====Graff====&lt;br /&gt;
&lt;br /&gt;
An early demonstration of Graff, which ''is a lighweight high-performance graphics rendering library.''&lt;br /&gt;
http://www.mdk.org.pl/articles/2007/04/23/chapter-1-in-which-we-meet-graff&lt;br /&gt;
&lt;br /&gt;
Be sure to check out this demo (scrolling list with inertia scrolling)&lt;br /&gt;
http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Of course it will remind you of Apple iPhone's UI. But this one runs in software mode on Nokia N770&amp;amp;800 already. The most notable part of Graff seems to be the inertia and physics integration in general.&lt;br /&gt;
&lt;br /&gt;
====Pigment API====&lt;br /&gt;
&lt;br /&gt;
Fluendo's (the Gstreamer guys) ''[https://core.fluendo.com/pigment/trac Pigment] is a Python library designed to easily build user interfaces with embedded multimedia. Its design allows to use it on several platforms, thanks to a plugin system allowing to choose the underlying graphical API. Pigment is the rendering engine of Elisa, the Fluendo Media Center project.''&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core language: C/Python&lt;br /&gt;
* Bindings: Python&lt;br /&gt;
* Backends: DirectFB OpenGL&lt;br /&gt;
&lt;br /&gt;
===Choosing===&lt;br /&gt;
&lt;br /&gt;
Benchmarking will be needed. We have therefore to define a std testing application that would allow to compare alternatives. &lt;br /&gt;
&lt;br /&gt;
Some Clutter VS Pigment information: http://www.taimila.com/?q=node/14&lt;br /&gt;
&lt;br /&gt;
==Improvement ideas==&lt;br /&gt;
&lt;br /&gt;
Please add here any idea that seems of relevance.&lt;br /&gt;
&lt;br /&gt;
===1D list scrolling: looped physics-driven item list===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
&lt;br /&gt;
Take an item list (ex: adress book), print it on a ribbon of paper, and glue it on a wheel (on the tire). You're looking in the front of it, so when you want to go from the A to Z, you touch the wheel and drag it up. When you let the wheel go, it goes furter, taken by it's inertia. Stop the wheel when you got your contact. Got the idea? That's why we may speak of an &amp;quot;infinite wheel&amp;quot;, so that the surface is flat. For our case here, we always want to display square content, so the [http://en.wikipedia.org/wiki/Uniform_prism n-sided uniform prism] analogy is mathematically more exact.&lt;br /&gt;
&lt;br /&gt;
Important features:&lt;br /&gt;
* '''weight''': the biggest the item list, the faster it scrolls; that way, you don't have to wait too long for big lists, and you don't miss your item on shorter lists&lt;br /&gt;
* '''friction''': there is friction where the wheel is fixed, so that the wheel doesn't turn infinitely; more friction on short lists, less on big ones&lt;br /&gt;
* the '''initial speed and acceleration vector''' you give it determines it's futher rotation&lt;br /&gt;
* it's &amp;quot;round&amp;quot;/cyclic, so you can '''browse the list in two directions'''&lt;br /&gt;
* we may want to add a &amp;quot;progression indicator&amp;quot;, ex the current alphabetical letter, with a font size adequate to the proportion of the number of entries in the letter subcategory, or a reduced map of the distribution of the first letters...&lt;br /&gt;
 &lt;br /&gt;
We can add &amp;quot;parallel wheels&amp;quot;, symbolizing different sorting methods. Slide long to the left / right to look at a different wheel = items organization.&lt;br /&gt;
&lt;br /&gt;
====Controls====&lt;br /&gt;
&lt;br /&gt;
* Sliding up/down = Single click + maintained for a minimal distance&lt;br /&gt;
&lt;br /&gt;
Effect: scroll in an inverted/negated fashion (slide down = scroll up, slide up = scroll down)&lt;br /&gt;
&lt;br /&gt;
When finger is released (i.e. touchscreen doesn't detect any press):&lt;br /&gt;
  if (last_speed_seen &amp;gt; 0 ) then keep this speed and acceleration, with friction&lt;br /&gt;
  else stop scrolling&lt;br /&gt;
&lt;br /&gt;
Scrolling here is seen as unidimensional, but can apply to bidimensional situations (ex: zoomed image) too&lt;br /&gt;
&lt;br /&gt;
* Action = quick double tap&lt;br /&gt;
&lt;br /&gt;
* Details/select = short single tap&lt;br /&gt;
&lt;br /&gt;
* Right click = long tap&lt;br /&gt;
&lt;br /&gt;
* Sliding left/right: switch sorting method&lt;br /&gt;
&lt;br /&gt;
====Parts to modify====&lt;br /&gt;
&lt;br /&gt;
''Having a scroll that isn't a 1:1 map to the user's action isn't hard. It's just an extra calculation in the scroll code.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;---- Where is the scroll code? :)&lt;br /&gt;
&lt;br /&gt;
* libmokoui&lt;br /&gt;
** [[Stylus_Scrolling | Stylus scrolling widget]]&lt;br /&gt;
** [[Finger_Scrolling | Finger scrolling wheel widget]]&lt;br /&gt;
* gtk&lt;br /&gt;
** [http://www.gtk.org/api/2.6/gtk/GtkVScrollbar.html GtkVScrollbar]&lt;br /&gt;
&lt;br /&gt;
The best would be to add the feature for both finger and stylus scrolling.&lt;br /&gt;
&lt;br /&gt;
TODO:&lt;br /&gt;
* make the entire list a &amp;quot;scrolling zone&amp;quot;, i.e. an overlay transparent scrolling widget?&lt;br /&gt;
* define controls&lt;br /&gt;
* add the inertia feature&lt;br /&gt;
&lt;br /&gt;
===1D Scrolling: inertia friction integration into openmoko's finger wheel=== &lt;br /&gt;
&lt;br /&gt;
The same, but for the wheel. It can be very short to do: you don't have 1:1 anymore, but, for example, 1/4 wheel turn = 1 item. It's demultiplicated, but has inertia.&lt;br /&gt;
&lt;br /&gt;
===Left-handed UI Support===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
A discussion on the community list identified a desire to have the ability to switch the OpenMoko UI into &amp;quot;left-handed&amp;quot; mode.  &lt;br /&gt;
&lt;br /&gt;
 The main problem is scrollbars, when they're on the right, dragging  &lt;br /&gt;
 the scrollbar left handed results in your hand covering the screen so  &lt;br /&gt;
 you can't see what you are doing. So having the option of scrollbars  &lt;br /&gt;
 on the left would be useful.&lt;br /&gt;
&lt;br /&gt;
 I don't think the whole screen should be mirrored! There are some elements&lt;br /&gt;
 that should remain..like the main top bar with the status icons and such.&lt;br /&gt;
 Scrollbars are the main thing I can think of right now.&lt;br /&gt;
&lt;br /&gt;
===Handgesture recognition proposals===&lt;br /&gt;
&lt;br /&gt;
====Using simple, localized warp as modifier key====&lt;br /&gt;
&lt;br /&gt;
As discussed on community list:&lt;br /&gt;
&lt;br /&gt;
  If you hold down one finger and tap the other one, the mouse pops over and back&lt;br /&gt;
  again. If you keep your second finger touching, the cursor follows it. When you&lt;br /&gt;
  release it, cursor goes back to first finger position. This could be a way to&lt;br /&gt;
  set a bounding box or turn on the mode. So the second finger can do something&lt;br /&gt;
  like rotating around the first, or increase or lower the distance to the first.&lt;br /&gt;
&lt;br /&gt;
* the so-called &amp;quot;first touch&amp;quot; can be done on the mokowheel zone itself: put your left thumb on the black area; if you touch the screen with another finger, there is a '''warp'''; the warp is detectable and allows to enter &amp;quot;fake multi-touchscreen mode&amp;quot;&lt;br /&gt;
* afterwards,&lt;br /&gt;
     * slide your right-hand finger down, it scrolls up&lt;br /&gt;
     * slide your right-hand finger up, it scrolls down&lt;br /&gt;
     * slide it left, next page/item&lt;br /&gt;
     * slide it right, previous page/item&lt;br /&gt;
     * do a circle: rotation&lt;br /&gt;
     * narrow towards the black circle: zoom -&lt;br /&gt;
     * go away: zoom +&lt;br /&gt;
* if you had kept your first finger on the black quarter circle, you can continue issuing other gestures&lt;br /&gt;
&lt;br /&gt;
The advantages of using simple origin-driven cursor warping as double touch detection criteria is that:&lt;br /&gt;
* you don't have to use the wheel as button, which would slow things down and generate errors (false button presses)&lt;br /&gt;
* simpler detection algorithms that can pass by the fluctuation due to pressure relative distribution&lt;br /&gt;
* the space taken by the wheel itself is &amp;quot;useless&amp;quot; (i.e. displays no information); using it as modifier allows to keep the screen clean for reading&lt;br /&gt;
* the origin of this zone lets use maximum surface of the screen, allowing more fine controlling&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_rotate_right.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_previous.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_down.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_zoom-.png]]&lt;br /&gt;
&lt;br /&gt;
*Pros:&lt;br /&gt;
** who said we need multi-touch hardware?&lt;br /&gt;
** this may be the easiest way (in terms of design/implementation complexity, reliability)&lt;br /&gt;
*Cons: &lt;br /&gt;
** no matter what we'll invent, we'll need two hands for on-the-move controlling&lt;br /&gt;
** what about left-handed people?&lt;br /&gt;
&lt;br /&gt;
====What is to modify ?====&lt;br /&gt;
&lt;br /&gt;
We need to emulate key presses. We need to work at a layer where we can get raw cursor coordinates. &amp;lt;---- X server layer?&lt;br /&gt;
&lt;br /&gt;
====Full multi-touch emulation====&lt;br /&gt;
&lt;br /&gt;
Doable, but tricky...&lt;br /&gt;
&lt;br /&gt;
==Open questions==&lt;br /&gt;
&lt;br /&gt;
* will the neo/openmoko graphics system be powerful enough for such uses? I apple uses an OpenGL ES acceleration on this device (as well as on recent iPods), which is on the way with [[GTA02#.22Phase_2.22_.28GTA02.2C_.22Mass_Market.22.29|GTA02]].&lt;br /&gt;
* how does the touchscreen behave? We need a detailed touchscreen wiki information page, with visual traces. How hardware-specific is it?&lt;br /&gt;
* is multi touch really that awesome? I guess not.&lt;br /&gt;
&lt;br /&gt;
{{Languages|UI Improvements}}&lt;br /&gt;
&lt;br /&gt;
[[Category:User Interfaces| ]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/UI_Improvements</id>
		<title>UI Improvements</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/UI_Improvements"/>
				<updated>2007-07-27T16:56:39Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Clutter Toolkit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
  Obviously the tools are in the wild to build interfaces that could rival&lt;br /&gt;
  (or better IMO) anything Apple comes up with. We just need to organize&lt;br /&gt;
  this stuff. This would need hardware that can support dynamic&lt;br /&gt;
  interfaces. I can help here, too.&lt;br /&gt;
  sean@openmoko.com&lt;br /&gt;
&lt;br /&gt;
In fact, this place shall be dedicated to human-machine interactions improvements discussion;&lt;br /&gt;
&lt;br /&gt;
Human-machine interaction can be separated into several aspects:&lt;br /&gt;
* the physical contact/input device: the mono-touch touchscreen&lt;br /&gt;
* the graphics: &lt;br /&gt;
** accelerated rendering can add more consistency to zooming user interfaces, which seem to be quite an interesting concept for embedded scrensize-limited devices&lt;br /&gt;
** adding physics &amp;quot;look and feel&amp;quot; to (ex: menu's) behaviours can add coherence too&lt;br /&gt;
* the input methods&lt;br /&gt;
** the virtual keyboard&lt;br /&gt;
** handgestures&lt;br /&gt;
&lt;br /&gt;
==Finding inspiration ...==&lt;br /&gt;
&lt;br /&gt;
===Seen Live===&lt;br /&gt;
&lt;br /&gt;
'''Multi-touch'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=89sz8ExZndc Multi-Touchscreen experiments video @youtube]&lt;br /&gt;
*[http://www.youtube.com/watch?v=nPqqfVLQ_qY iPhone UI features demo @youtube]&lt;br /&gt;
&lt;br /&gt;
'''Zooming user interfaces'''&lt;br /&gt;
*[http://www.zenzui.com/products.html ZenZui], a [http://en.wikipedia.org/wiki/ZUI ZUI (zooming user interface)]&lt;br /&gt;
*[http://labs.live.com/Deepfish/videos.aspx Microsoft Bluefish's ZUI] (new mobile webbrowser)&lt;br /&gt;
*[http://googlesystem.blogspot.com/2007/04/opera-920-more-homepages-at-your.html Opera speed dial]&lt;br /&gt;
&lt;br /&gt;
'''Graphics'''&lt;br /&gt;
*[http://www.rasterman.com/files/eem.avi EEM], Rasterman's EFL libs on handelds proof of concept (doesn't DO anything, just showing off the EFLs on a handeld)&lt;br /&gt;
*[http://www.youtube.com/watch?v=8kLFPfaxQ6U&amp;amp;eurl= Nvidia's cutting-edge techno], an [http://www.khronos.org/openkode/ Openkode] demo.&lt;br /&gt;
&lt;br /&gt;
'''Science fiction'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=G_FS2TiK3AI UPMC Future?]&lt;br /&gt;
&lt;br /&gt;
'''Links:'''&lt;br /&gt;
*[http://elevate.sourceforge.net/links.html elevate project's links] sums up quite greatly the latest innovations in the desktop area&lt;br /&gt;
*[http://nooface.net/ Nooface] is a human-machine news site&lt;br /&gt;
*Asus-Intel's [http://www.hothardware.com/articles/Hands_on_with_the_ASUS_Eee/?page=2 Eee]'s interface&lt;br /&gt;
&lt;br /&gt;
===Clever hacks===&lt;br /&gt;
&lt;br /&gt;
It's been said that having no multitouch screen allows less freedom for innovation. Maybe we could get something out of our touchscreen drivers.&lt;br /&gt;
&lt;br /&gt;
Why ? Think of apple's scroll up/down feature on macbooks touchpads (which '''aren't multi touch''', it's a [http://iscroll2.sourceforge.net/ clever driver hack, iscroll2]):&lt;br /&gt;
&lt;br /&gt;
  To scroll, just place two fingers on your trackpad instead of one. Both fingers&lt;br /&gt;
  need to be placed next to each other horizontally (not vertically, the trackpad &lt;br /&gt;
  cannot detect that). Some people get better results with their finger spaced a&lt;br /&gt;
  little bit apart, while others prefer having the fingers right next to each other.&lt;br /&gt;
&lt;br /&gt;
  iScroll2 provides two scrolling modes: Linear and circular scrolling.&lt;br /&gt;
&lt;br /&gt;
  For linear scrolling, move the two fingers up/down or left/right in a straight &lt;br /&gt;
  line, respectively, to scroll in that direction.&lt;br /&gt;
&lt;br /&gt;
  Circular scrolling works in a way similar to the iPod's scroll wheel: Move the two&lt;br /&gt;
  fingers in a circle to scroll up or down, depending   on whether you move in a &lt;br /&gt;
  clockwise or counterclockwise direction.&lt;br /&gt;
&lt;br /&gt;
Maybe we can port/adapt/get inspiration from this macintosh driver.&lt;br /&gt;
&lt;br /&gt;
===n-D navigation: the polyhedra inspiration===&lt;br /&gt;
&lt;br /&gt;
When we want to navigate files, mp3s in an mp3 player, etc... Every control that the application needs is a button. What about looking at the polyhedrons? We could find one for each usage, with as many surrounding subzones that may be used as controls. Ex: you need 5 buttons, let's take a pentagon with 5 surrounding zones all around. That way, it's always optimized...&lt;br /&gt;
&lt;br /&gt;
http://en.wikipedia.org/wiki/Polyhedra&lt;br /&gt;
http://en.wikipedia.org/wiki/List_of_uniform_polyhedra&lt;br /&gt;
&lt;br /&gt;
===Our weapons===&lt;br /&gt;
&lt;br /&gt;
We can't improve the human-machine interface without knowing the strengths / weaknesses of our hardware; some of the weaknesses might turn out as exploitable features, some strengths as limiting constraints.&lt;br /&gt;
&lt;br /&gt;
====The touchscreen====&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What exactly does the touchscreen see when  you touch the screen with 2 fingers&lt;br /&gt;
  at the same time, when you move them, when you move only one of the 2, etc. I'm &lt;br /&gt;
  also interested in knowing how precise the touchscreen is (ex: refresh rate, &lt;br /&gt;
  possible pressure indication, ...)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* The output is the center of the bounding box of the touched area&lt;br /&gt;
* The touch point skips instantly on double touch&lt;br /&gt;
* Pressure has almost no effect on a single touch, but not so on a double touch. The relative pressures will cause a significant skewing effect towards the harder touch. You can easily move the pointer along the line between your two fingers by changing the relative pressure.&lt;br /&gt;
&lt;br /&gt;
Conclusions:&lt;br /&gt;
* we can detect double touch as jumps, and that's all&lt;br /&gt;
* no pressure&lt;br /&gt;
* This could be an interesting input method for games - e.g. holding the Neo in landscape view, letting each thumb rest on a specific input area; probably needs to be checked for usability with a real device&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when sliding two fingers in parallel up(L,R)-&amp;gt;down(L,R)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see a slide along the center line between your two fingers. In practice, you can't keep the pressure equal, so you will see some kind of zig-zag line somewhere between the two pressure points in the direction of your slide.&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when narrowing two fingers in slide (=zoom effect on iphone)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see the pointer stay at the center of the zoom movement. In practice, you can't keep the pressure equal for both fingers, so the pointer will move towards one of the two pressure points.&lt;br /&gt;
&lt;br /&gt;
====Graphics and computational capabilities====&lt;br /&gt;
&lt;br /&gt;
It would be good to report what performance the current hardware allows:&lt;br /&gt;
* There was no pure X11 benchmarking done (AFAIK) (how many fps at full VGA scrolling, ex: 1024*480 image scrolling?)&lt;br /&gt;
* what about the lcd reactivity? What if we don't see anything but blur while moving items fast?&lt;br /&gt;
&lt;br /&gt;
Please report here your impressions.&lt;br /&gt;
&lt;br /&gt;
==Areas of improvement==&lt;br /&gt;
&lt;br /&gt;
* OpenGL for fluid zooming interfaces (2D: the infinite sphere model, 1D: the infinite wheel of fortune/ribbon model, exposé)&lt;br /&gt;
* HandGestures&lt;br /&gt;
* Physics-model based improvements: inertia and friction&lt;br /&gt;
* multi touch screen for natural handgestures &lt;br /&gt;
* improved virtual keyboard&lt;br /&gt;
* switching to another GUI toolkit (EFLs)&lt;br /&gt;
&lt;br /&gt;
===Physics-inspired animation a.k.a. &amp;quot;Digital Physics&amp;quot;===&lt;br /&gt;
&lt;br /&gt;
If we want to add eye candy &amp;amp; usability to the UI (such as smooth realistic list scrolling, as seen in apple's&lt;br /&gt;
iphone demo on contacts lists for instance), we'll need a physics engine, so that moves &amp;amp; animations aren't all linear.&lt;br /&gt;
&lt;br /&gt;
The following aticle explains the [http://www.readwriteweb.com/archives/the_physics_of_iphone.php Digital Physics] term from the iPhone example.&lt;br /&gt;
&lt;br /&gt;
The most used technique for calculating trajectories and systems of related geometrical objects seems to be [http://en.wikipedia.org/wiki/Verlet_integration verlet integration] implementation; it is an alternative to Euler's integration method, using fast approximation. &lt;br /&gt;
&lt;br /&gt;
We may have no need for such a mathematical method at first, but perhaps there are other use cases. For instance, it may be useful to gesture recognition (i'm not aware if existing gesture recognition engines measure speed, acceleration...).&lt;br /&gt;
&lt;br /&gt;
====Open Dynamics Engine====&lt;br /&gt;
&lt;br /&gt;
ODE is an open source, high performance library for simulating rigid body dynamics. It is fully featured, stable, mature and platform independent with an easy to use C/C++ API. It has advanced joint types and integrated collision detection with friction. ODE is useful for simulating vehicles, objects in virtual reality environments and virtual creatures. It is currently used in many computer games, 3D authoring tools and simulation tools.&lt;br /&gt;
&lt;br /&gt;
http://www.ode.org/&lt;br /&gt;
&lt;br /&gt;
====Libakamaru====&lt;br /&gt;
&lt;br /&gt;
The [http://people.freedesktop.org/~krh/akamaru.git/ akamaru library] is the code behind [http://www.youtube.com/watch?v=VekgyKQoTeM kiba dock]'s fun and dynamic behaviour. It's dependencies are light (needs just GLib). It takes elasticity, friction, gravity into account.&lt;br /&gt;
&lt;br /&gt;
If you want to take a quick look at the code:&lt;br /&gt;
svn co http://svn.kiba-dock.org/akamaru/ akamaru&lt;br /&gt;
&lt;br /&gt;
The only (AFAIK) application using this library is kiba-dock, a *fun* app launcher, but we may find another use to it in the future.&lt;br /&gt;
&lt;br /&gt;
As suggested on the mailing list, it is mostly overkill for the uses we intend to have, but this library may be optimized already, the API can spare some time for too. Furthermore, ''Qui peut le plus, peut le moins''.&lt;br /&gt;
&lt;br /&gt;
====Verlet integration implementation from e17====&lt;br /&gt;
&lt;br /&gt;
There's an undergoing verlet integration implementation into the e17 project (by rephorm) see http://rephorm.com/news/tag/physics , so we may see some UI physics integration into e17 someday.&lt;br /&gt;
&lt;br /&gt;
====Robert Pernner's easy equations====&lt;br /&gt;
&lt;br /&gt;
http://www.robertpenner.com/easing/&lt;br /&gt;
&lt;br /&gt;
See the demo: implements non linear behaviour (actionscript), but may give inspiration&lt;br /&gt;
&lt;br /&gt;
===Extending the touchscreen capabilities and input methods===&lt;br /&gt;
&lt;br /&gt;
* '''Multitouchscreen emulation'''&lt;br /&gt;
&lt;br /&gt;
If we got it right, when touching the screen on a second place, the cursor oscillates between the two points depending on relative pressure distribution. Using averaging algorithms, we may have the opportunity to detect peculiar behaviours.&lt;br /&gt;
&lt;br /&gt;
We need raw data (x,y,t) from the real hardware for the following behaviours:&lt;br /&gt;
* slide two fingers in parallel - vertical up/down (scroll)&lt;br /&gt;
* turn the two fingers around (rotate)&lt;br /&gt;
* slide two fingers towards each other (zoom-)&lt;br /&gt;
* slide two fingers apart (zoom+)&lt;br /&gt;
&lt;br /&gt;
When touching the screen with two fingers at the same time, we necessarily see the two points, or are able to extrapolate the position of the second one. This solution can add feature, but will probably be little erratic...&lt;br /&gt;
&lt;br /&gt;
* '''Touchscreen kernel module hacking'''&lt;br /&gt;
&lt;br /&gt;
We may correct the &amp;quot;half distance&amp;quot; phenomenon on double touch: if double touch is detected, then assimilate the cursor as twice further than the first touch. It would allow finer control, but higher instability.&lt;br /&gt;
&lt;br /&gt;
The double touch detection may be implemented in the driver itself, as well as stabilization.&lt;br /&gt;
&lt;br /&gt;
* '''Other detectable behaviours'''&lt;br /&gt;
&lt;br /&gt;
The warping can be used in the 4 diagonals, plus the up/down/right/left cross:&lt;br /&gt;
&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
  - 1            -  - 1          2 -  - 1            -  -      2       -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -             2-  -              -  - 2            -  -      1       -&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
&lt;br /&gt;
It's not double touch, but two sequential presses with a short time in between (~0.5 s)&lt;br /&gt;
&lt;br /&gt;
===Improved virtual keyboard===&lt;br /&gt;
&lt;br /&gt;
One nice idea for virtual input is [http://www.micropp.se/openmoko/ finger-splash]&lt;br /&gt;
&lt;br /&gt;
Yet, optimization does not only apply to the plain one-letter-at-a-time input. We need some sort of T9 (dictionary-based input help). When typing a word, the first letter determines the next possible ones. Therefore, we may let disappear the less-probable following letters. Ex: type an L, there's no way an X follows...&lt;br /&gt;
&lt;br /&gt;
Hints: &lt;br /&gt;
* ZIP's huffmann compression applied to SMSs/mails for detecting the most used characters/words/sentences.&lt;br /&gt;
* html tag-clouds, one-letter tag clouds ; font size proportional to the probability of being used&lt;br /&gt;
&lt;br /&gt;
The most critical point is the initial disposition of the letters, before any letter is typed. We may also want to use horizontal two-parts keyboard (with the neo in hands like a psp..)&lt;br /&gt;
&lt;br /&gt;
The [http://www.strout.net/info/ideas/hexinput.html hexinput] concept is interesting. What about hiding the less probable letters and increasing the remaining ones during typing?&lt;br /&gt;
&lt;br /&gt;
===Towards OpenGL compositing===&lt;br /&gt;
&lt;br /&gt;
There are [http://www.hbmobile.org/wiki/index.php?title=GUI_Frameworks lots of possible GUI frameworks] with various software architectures that could be used for OpenMoko.&lt;br /&gt;
&lt;br /&gt;
GTA01 hardware uses GTK+/matchbox without hardware acceleration, and it's not enough: this is a first that a mobile Linux device has such a high DPI resolution. OpenGL ES compositing seems to have a bright future on embedded devices, because compositing seems to give natural zooming interfaces reality (at last!).&lt;br /&gt;
&lt;br /&gt;
Considering recent changes in destkop applications, opengl has a definite future. For instance, the expose (be it apple's or beryl's) is a very interesting and usable feature. Using compositing allows the physics metaphore: '''the human brain doesn't like &amp;quot;gaps&amp;quot;/jumps (for instance while scrolling a text), it needs continuity''', which can be provided by opengl. When you look at apple's iphone prototype, it's not just eye candy, it's maybe the most natural/human way of navigating, because it's sufficiently realistic for the brain to forget the non-physical nature of what's inside.&lt;br /&gt;
&lt;br /&gt;
So, opengl hardware will be needed in a more or less distant hardware, for 100% fluid operation. Benchmarking will be needed to compare the different alternatives that are cited further.&lt;br /&gt;
&lt;br /&gt;
====Switching to the Enlightenment Foundation Libraries====&lt;br /&gt;
&lt;br /&gt;
Evas is a powerful and power sparing canvas drawing library. It can be OpenGL accelerated. Python/Ruby bindings are available in the &amp;quot;proto&amp;quot; e17 cvs folder.&lt;br /&gt;
&lt;br /&gt;
''Moved [[E17|here]]''&lt;br /&gt;
&lt;br /&gt;
====Clutter Toolkit====&lt;br /&gt;
&lt;br /&gt;
Clutter, an [http://o-hand.com/ OpenedHand] project, is an open source software library for creating fast, visually rich graphical user interfaces. The most obvious example of potential usage is in media center type applications.&lt;br /&gt;
&lt;br /&gt;
http://clutter-project.org/&lt;br /&gt;
&lt;br /&gt;
Clutter uses OpenGL (and optionally '''OpenGL ES''') for rendering but with an API which hides the underlying GL complexity from the developer. The Clutter API is intended to be easy to use, efficient and flexible.&lt;br /&gt;
&lt;br /&gt;
It does integrate gstreamer (for easy media playback, even camera or mic inputs), allows pango text rendering, cairo graphics rendering. Provided bindings are python, C# and Ruby.&lt;br /&gt;
&lt;br /&gt;
GTK off screen rendering is supposed to be on it's way; once it is here, there will be a possibility of using GTK apps directly within OpenGL apps as textures, which would lead to the possibility of creating a full OpenGL &amp;quot;application manager&amp;quot; (as well as media consuming app) with ZUI features.&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core language: C&lt;br /&gt;
* Language bindings: Python, C#, Ruby&lt;br /&gt;
* Media support: Gstreamer integration&lt;br /&gt;
* Embedding: GTK embedding&lt;br /&gt;
&lt;br /&gt;
====Graff====&lt;br /&gt;
&lt;br /&gt;
An early demonstration of Graff, which ''is a lighweight high-performance graphics rendering library.''&lt;br /&gt;
http://www.mdk.org.pl/articles/2007/04/23/chapter-1-in-which-we-meet-graff&lt;br /&gt;
&lt;br /&gt;
Be sure to check out this demo (scrolling list with inertia scrolling)&lt;br /&gt;
http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Of course it will remind you of Apple iPhone's UI. But this one runs in software mode on Nokia N770&amp;amp;800 already. The most notable part of Graff seems to be the inertia and physics integration in general.&lt;br /&gt;
&lt;br /&gt;
====Pigment API====&lt;br /&gt;
&lt;br /&gt;
Fluendo's (the Gstreamer guys) ''[https://core.fluendo.com/pigment/trac Pigment] is a Python library designed to easily build user interfaces with embedded multimedia. Its design allows to use it on several platforms, thanks to a plugin system allowing to choose the underlying graphical API. Pigment is the rendering engine of Elisa, the Fluendo Media Center project.''&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core language: C/Python&lt;br /&gt;
* Bindings: Python&lt;br /&gt;
* Backends: DirectFB OpenGL&lt;br /&gt;
&lt;br /&gt;
===Choosing===&lt;br /&gt;
&lt;br /&gt;
Benchmarking will be needed. We have therefore to define a std testing application that would allow to compare alternatives. &lt;br /&gt;
&lt;br /&gt;
Some Clutter VS Pigment information: http://www.taimila.com/?q=node/14&lt;br /&gt;
&lt;br /&gt;
==Improvement ideas==&lt;br /&gt;
&lt;br /&gt;
Please add here any idea that seems of relevance.&lt;br /&gt;
&lt;br /&gt;
===1D list scrolling: looped physics-driven item list===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
&lt;br /&gt;
Take an item list (ex: adress book), print it on a ribbon of paper, and glue it on a wheel (on the tire). You're looking in the front of it, so when you want to go from the A to Z, you touch the wheel and drag it up. When you let the wheel go, it goes furter, taken by it's inertia. Stop the wheel when you got your contact. Got the idea? That's why we may speak of an &amp;quot;infinite wheel&amp;quot;, so that the surface is flat. For our case here, we always want to display square content, so the [http://en.wikipedia.org/wiki/Uniform_prism n-sided uniform prism] analogy is mathematically more exact.&lt;br /&gt;
&lt;br /&gt;
Important features:&lt;br /&gt;
* '''weight''': the biggest the item list, the faster it scrolls; that way, you don't have to wait too long for big lists, and you don't miss your item on shorter lists&lt;br /&gt;
* '''friction''': there is friction where the wheel is fixed, so that the wheel doesn't turn infinitely; more friction on short lists, less on big ones&lt;br /&gt;
* the '''initial speed and acceleration vector''' you give it determines it's futher rotation&lt;br /&gt;
* it's &amp;quot;round&amp;quot;/cyclic, so you can '''browse the list in two directions'''&lt;br /&gt;
* we may want to add a &amp;quot;progression indicator&amp;quot;, ex the current alphabetical letter, with a font size adequate to the proportion of the number of entries in the letter subcategory, or a reduced map of the distribution of the first letters...&lt;br /&gt;
 &lt;br /&gt;
We can add &amp;quot;parallel wheels&amp;quot;, symbolizing different sorting methods. Slide long to the left / right to look at a different wheel = items organization.&lt;br /&gt;
&lt;br /&gt;
====Controls====&lt;br /&gt;
&lt;br /&gt;
* Sliding up/down = Single click + maintained for a minimal distance&lt;br /&gt;
&lt;br /&gt;
Effect: scroll in an inverted/negated fashion (slide down = scroll up, slide up = scroll down)&lt;br /&gt;
&lt;br /&gt;
When finger is released (i.e. touchscreen doesn't detect any press):&lt;br /&gt;
  if (last_speed_seen &amp;gt; 0 ) then keep this speed and acceleration, with friction&lt;br /&gt;
  else stop scrolling&lt;br /&gt;
&lt;br /&gt;
Scrolling here is seen as unidimensional, but can apply to bidimensional situations (ex: zoomed image) too&lt;br /&gt;
&lt;br /&gt;
* Action = quick double tap&lt;br /&gt;
&lt;br /&gt;
* Details/select = short single tap&lt;br /&gt;
&lt;br /&gt;
* Right click = long tap&lt;br /&gt;
&lt;br /&gt;
* Sliding left/right: switch sorting method&lt;br /&gt;
&lt;br /&gt;
====Parts to modify====&lt;br /&gt;
&lt;br /&gt;
''Having a scroll that isn't a 1:1 map to the user's action isn't hard. It's just an extra calculation in the scroll code.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;---- Where is the scroll code? :)&lt;br /&gt;
&lt;br /&gt;
* libmokoui&lt;br /&gt;
** [[Stylus_Scrolling | Stylus scrolling widget]]&lt;br /&gt;
** [[Finger_Scrolling | Finger scrolling wheel widget]]&lt;br /&gt;
* gtk&lt;br /&gt;
** [http://www.gtk.org/api/2.6/gtk/GtkVScrollbar.html GtkVScrollbar]&lt;br /&gt;
&lt;br /&gt;
The best would be to add the feature for both finger and stylus scrolling.&lt;br /&gt;
&lt;br /&gt;
TODO:&lt;br /&gt;
* make the entire list a &amp;quot;scrolling zone&amp;quot;, i.e. an overlay transparent scrolling widget?&lt;br /&gt;
* define controls&lt;br /&gt;
* add the inertia feature&lt;br /&gt;
&lt;br /&gt;
===1D Scrolling: inertia friction integration into openmoko's finger wheel=== &lt;br /&gt;
&lt;br /&gt;
The same, but for the wheel. It can be very short to do: you don't have 1:1 anymore, but, for example, 1/4 wheel turn = 1 item. It's demultiplicated, but has inertia.&lt;br /&gt;
&lt;br /&gt;
===Left-handed UI Support===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
A discussion on the community list identified a desire to have the ability to switch the OpenMoko UI into &amp;quot;left-handed&amp;quot; mode.  &lt;br /&gt;
&lt;br /&gt;
 The main problem is scrollbars, when they're on the right, dragging  &lt;br /&gt;
 the scrollbar left handed results in your hand covering the screen so  &lt;br /&gt;
 you can't see what you are doing. So having the option of scrollbars  &lt;br /&gt;
 on the left would be useful.&lt;br /&gt;
&lt;br /&gt;
 I don't think the whole screen should be mirrored! There are some elements&lt;br /&gt;
 that should remain..like the main top bar with the status icons and such.&lt;br /&gt;
 Scrollbars are the main thing I can think of right now.&lt;br /&gt;
&lt;br /&gt;
===Handgesture recognition proposals===&lt;br /&gt;
&lt;br /&gt;
====Using simple, localized warp as modifier key====&lt;br /&gt;
&lt;br /&gt;
As discussed on community list:&lt;br /&gt;
&lt;br /&gt;
  If you hold down one finger and tap the other one, the mouse pops over and back&lt;br /&gt;
  again. If you keep your second finger touching, the cursor follows it. When you&lt;br /&gt;
  release it, cursor goes back to first finger position. This could be a way to&lt;br /&gt;
  set a bounding box or turn on the mode. So the second finger can do something&lt;br /&gt;
  like rotating around the first, or increase or lower the distance to the first.&lt;br /&gt;
&lt;br /&gt;
* the so-called &amp;quot;first touch&amp;quot; can be done on the mokowheel zone itself: put your left thumb on the black area; if you touch the screen with another finger, there is a '''warp'''; the warp is detectable and allows to enter &amp;quot;fake multi-touchscreen mode&amp;quot;&lt;br /&gt;
* afterwards,&lt;br /&gt;
     * slide your right-hand finger down, it scrolls up&lt;br /&gt;
     * slide your right-hand finger up, it scrolls down&lt;br /&gt;
     * slide it left, next page/item&lt;br /&gt;
     * slide it right, previous page/item&lt;br /&gt;
     * do a circle: rotation&lt;br /&gt;
     * narrow towards the black circle: zoom -&lt;br /&gt;
     * go away: zoom +&lt;br /&gt;
* if you had kept your first finger on the black quarter circle, you can continue issuing other gestures&lt;br /&gt;
&lt;br /&gt;
The advantages of using simple origin-driven cursor warping as double touch detection criteria is that:&lt;br /&gt;
* you don't have to use the wheel as button, which would slow things down and generate errors (false button presses)&lt;br /&gt;
* simpler detection algorithms that can pass by the fluctuation due to pressure relative distribution&lt;br /&gt;
* the space taken by the wheel itself is &amp;quot;useless&amp;quot; (i.e. displays no information); using it as modifier allows to keep the screen clean for reading&lt;br /&gt;
* the origin of this zone lets use maximum surface of the screen, allowing more fine controlling&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_rotate_right.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_previous.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_down.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_zoom-.png]]&lt;br /&gt;
&lt;br /&gt;
*Pros:&lt;br /&gt;
** who said we need multi-touch hardware?&lt;br /&gt;
** this may be the easiest way (in terms of design/implementation complexity, reliability)&lt;br /&gt;
*Cons: &lt;br /&gt;
** no matter what we'll invent, we'll need two hands for on-the-move controlling&lt;br /&gt;
** what about left-handed people?&lt;br /&gt;
&lt;br /&gt;
====What is to modify ?====&lt;br /&gt;
&lt;br /&gt;
We need to emulate key presses. We need to work at a layer where we can get raw cursor coordinates. &amp;lt;---- X server layer?&lt;br /&gt;
&lt;br /&gt;
====Full multi-touch emulation====&lt;br /&gt;
&lt;br /&gt;
Doable, but tricky...&lt;br /&gt;
&lt;br /&gt;
==Open questions==&lt;br /&gt;
&lt;br /&gt;
* will the neo/openmoko graphics system be powerful enough for such uses? I apple uses an OpenGL ES acceleration on this device (as well as on recent iPods), which is on the way with [[GTA02#.22Phase_2.22_.28GTA02.2C_.22Mass_Market.22.29|GTA02]].&lt;br /&gt;
* how does the touchscreen behave? We need a detailed touchscreen wiki information page, with visual traces. How hardware-specific is it?&lt;br /&gt;
* is multi touch really that awesome? I guess not.&lt;br /&gt;
&lt;br /&gt;
{{Languages|UI Improvements}}&lt;br /&gt;
&lt;br /&gt;
[[Category:User Interfaces| ]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/UI_Improvements</id>
		<title>UI Improvements</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/UI_Improvements"/>
				<updated>2007-07-27T16:55:04Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Pigment API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
  Obviously the tools are in the wild to build interfaces that could rival&lt;br /&gt;
  (or better IMO) anything Apple comes up with. We just need to organize&lt;br /&gt;
  this stuff. This would need hardware that can support dynamic&lt;br /&gt;
  interfaces. I can help here, too.&lt;br /&gt;
  sean@openmoko.com&lt;br /&gt;
&lt;br /&gt;
In fact, this place shall be dedicated to human-machine interactions improvements discussion;&lt;br /&gt;
&lt;br /&gt;
Human-machine interaction can be separated into several aspects:&lt;br /&gt;
* the physical contact/input device: the mono-touch touchscreen&lt;br /&gt;
* the graphics: &lt;br /&gt;
** accelerated rendering can add more consistency to zooming user interfaces, which seem to be quite an interesting concept for embedded scrensize-limited devices&lt;br /&gt;
** adding physics &amp;quot;look and feel&amp;quot; to (ex: menu's) behaviours can add coherence too&lt;br /&gt;
* the input methods&lt;br /&gt;
** the virtual keyboard&lt;br /&gt;
** handgestures&lt;br /&gt;
&lt;br /&gt;
==Finding inspiration ...==&lt;br /&gt;
&lt;br /&gt;
===Seen Live===&lt;br /&gt;
&lt;br /&gt;
'''Multi-touch'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=89sz8ExZndc Multi-Touchscreen experiments video @youtube]&lt;br /&gt;
*[http://www.youtube.com/watch?v=nPqqfVLQ_qY iPhone UI features demo @youtube]&lt;br /&gt;
&lt;br /&gt;
'''Zooming user interfaces'''&lt;br /&gt;
*[http://www.zenzui.com/products.html ZenZui], a [http://en.wikipedia.org/wiki/ZUI ZUI (zooming user interface)]&lt;br /&gt;
*[http://labs.live.com/Deepfish/videos.aspx Microsoft Bluefish's ZUI] (new mobile webbrowser)&lt;br /&gt;
*[http://googlesystem.blogspot.com/2007/04/opera-920-more-homepages-at-your.html Opera speed dial]&lt;br /&gt;
&lt;br /&gt;
'''Graphics'''&lt;br /&gt;
*[http://www.rasterman.com/files/eem.avi EEM], Rasterman's EFL libs on handelds proof of concept (doesn't DO anything, just showing off the EFLs on a handeld)&lt;br /&gt;
*[http://www.youtube.com/watch?v=8kLFPfaxQ6U&amp;amp;eurl= Nvidia's cutting-edge techno], an [http://www.khronos.org/openkode/ Openkode] demo.&lt;br /&gt;
&lt;br /&gt;
'''Science fiction'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=G_FS2TiK3AI UPMC Future?]&lt;br /&gt;
&lt;br /&gt;
'''Links:'''&lt;br /&gt;
*[http://elevate.sourceforge.net/links.html elevate project's links] sums up quite greatly the latest innovations in the desktop area&lt;br /&gt;
*[http://nooface.net/ Nooface] is a human-machine news site&lt;br /&gt;
*Asus-Intel's [http://www.hothardware.com/articles/Hands_on_with_the_ASUS_Eee/?page=2 Eee]'s interface&lt;br /&gt;
&lt;br /&gt;
===Clever hacks===&lt;br /&gt;
&lt;br /&gt;
It's been said that having no multitouch screen allows less freedom for innovation. Maybe we could get something out of our touchscreen drivers.&lt;br /&gt;
&lt;br /&gt;
Why ? Think of apple's scroll up/down feature on macbooks touchpads (which '''aren't multi touch''', it's a [http://iscroll2.sourceforge.net/ clever driver hack, iscroll2]):&lt;br /&gt;
&lt;br /&gt;
  To scroll, just place two fingers on your trackpad instead of one. Both fingers&lt;br /&gt;
  need to be placed next to each other horizontally (not vertically, the trackpad &lt;br /&gt;
  cannot detect that). Some people get better results with their finger spaced a&lt;br /&gt;
  little bit apart, while others prefer having the fingers right next to each other.&lt;br /&gt;
&lt;br /&gt;
  iScroll2 provides two scrolling modes: Linear and circular scrolling.&lt;br /&gt;
&lt;br /&gt;
  For linear scrolling, move the two fingers up/down or left/right in a straight &lt;br /&gt;
  line, respectively, to scroll in that direction.&lt;br /&gt;
&lt;br /&gt;
  Circular scrolling works in a way similar to the iPod's scroll wheel: Move the two&lt;br /&gt;
  fingers in a circle to scroll up or down, depending   on whether you move in a &lt;br /&gt;
  clockwise or counterclockwise direction.&lt;br /&gt;
&lt;br /&gt;
Maybe we can port/adapt/get inspiration from this macintosh driver.&lt;br /&gt;
&lt;br /&gt;
===n-D navigation: the polyhedra inspiration===&lt;br /&gt;
&lt;br /&gt;
When we want to navigate files, mp3s in an mp3 player, etc... Every control that the application needs is a button. What about looking at the polyhedrons? We could find one for each usage, with as many surrounding subzones that may be used as controls. Ex: you need 5 buttons, let's take a pentagon with 5 surrounding zones all around. That way, it's always optimized...&lt;br /&gt;
&lt;br /&gt;
http://en.wikipedia.org/wiki/Polyhedra&lt;br /&gt;
http://en.wikipedia.org/wiki/List_of_uniform_polyhedra&lt;br /&gt;
&lt;br /&gt;
===Our weapons===&lt;br /&gt;
&lt;br /&gt;
We can't improve the human-machine interface without knowing the strengths / weaknesses of our hardware; some of the weaknesses might turn out as exploitable features, some strengths as limiting constraints.&lt;br /&gt;
&lt;br /&gt;
====The touchscreen====&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What exactly does the touchscreen see when  you touch the screen with 2 fingers&lt;br /&gt;
  at the same time, when you move them, when you move only one of the 2, etc. I'm &lt;br /&gt;
  also interested in knowing how precise the touchscreen is (ex: refresh rate, &lt;br /&gt;
  possible pressure indication, ...)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* The output is the center of the bounding box of the touched area&lt;br /&gt;
* The touch point skips instantly on double touch&lt;br /&gt;
* Pressure has almost no effect on a single touch, but not so on a double touch. The relative pressures will cause a significant skewing effect towards the harder touch. You can easily move the pointer along the line between your two fingers by changing the relative pressure.&lt;br /&gt;
&lt;br /&gt;
Conclusions:&lt;br /&gt;
* we can detect double touch as jumps, and that's all&lt;br /&gt;
* no pressure&lt;br /&gt;
* This could be an interesting input method for games - e.g. holding the Neo in landscape view, letting each thumb rest on a specific input area; probably needs to be checked for usability with a real device&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when sliding two fingers in parallel up(L,R)-&amp;gt;down(L,R)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see a slide along the center line between your two fingers. In practice, you can't keep the pressure equal, so you will see some kind of zig-zag line somewhere between the two pressure points in the direction of your slide.&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when narrowing two fingers in slide (=zoom effect on iphone)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see the pointer stay at the center of the zoom movement. In practice, you can't keep the pressure equal for both fingers, so the pointer will move towards one of the two pressure points.&lt;br /&gt;
&lt;br /&gt;
====Graphics and computational capabilities====&lt;br /&gt;
&lt;br /&gt;
It would be good to report what performance the current hardware allows:&lt;br /&gt;
* There was no pure X11 benchmarking done (AFAIK) (how many fps at full VGA scrolling, ex: 1024*480 image scrolling?)&lt;br /&gt;
* what about the lcd reactivity? What if we don't see anything but blur while moving items fast?&lt;br /&gt;
&lt;br /&gt;
Please report here your impressions.&lt;br /&gt;
&lt;br /&gt;
==Areas of improvement==&lt;br /&gt;
&lt;br /&gt;
* OpenGL for fluid zooming interfaces (2D: the infinite sphere model, 1D: the infinite wheel of fortune/ribbon model, exposé)&lt;br /&gt;
* HandGestures&lt;br /&gt;
* Physics-model based improvements: inertia and friction&lt;br /&gt;
* multi touch screen for natural handgestures &lt;br /&gt;
* improved virtual keyboard&lt;br /&gt;
* switching to another GUI toolkit (EFLs)&lt;br /&gt;
&lt;br /&gt;
===Physics-inspired animation a.k.a. &amp;quot;Digital Physics&amp;quot;===&lt;br /&gt;
&lt;br /&gt;
If we want to add eye candy &amp;amp; usability to the UI (such as smooth realistic list scrolling, as seen in apple's&lt;br /&gt;
iphone demo on contacts lists for instance), we'll need a physics engine, so that moves &amp;amp; animations aren't all linear.&lt;br /&gt;
&lt;br /&gt;
The following aticle explains the [http://www.readwriteweb.com/archives/the_physics_of_iphone.php Digital Physics] term from the iPhone example.&lt;br /&gt;
&lt;br /&gt;
The most used technique for calculating trajectories and systems of related geometrical objects seems to be [http://en.wikipedia.org/wiki/Verlet_integration verlet integration] implementation; it is an alternative to Euler's integration method, using fast approximation. &lt;br /&gt;
&lt;br /&gt;
We may have no need for such a mathematical method at first, but perhaps there are other use cases. For instance, it may be useful to gesture recognition (i'm not aware if existing gesture recognition engines measure speed, acceleration...).&lt;br /&gt;
&lt;br /&gt;
====Open Dynamics Engine====&lt;br /&gt;
&lt;br /&gt;
ODE is an open source, high performance library for simulating rigid body dynamics. It is fully featured, stable, mature and platform independent with an easy to use C/C++ API. It has advanced joint types and integrated collision detection with friction. ODE is useful for simulating vehicles, objects in virtual reality environments and virtual creatures. It is currently used in many computer games, 3D authoring tools and simulation tools.&lt;br /&gt;
&lt;br /&gt;
http://www.ode.org/&lt;br /&gt;
&lt;br /&gt;
====Libakamaru====&lt;br /&gt;
&lt;br /&gt;
The [http://people.freedesktop.org/~krh/akamaru.git/ akamaru library] is the code behind [http://www.youtube.com/watch?v=VekgyKQoTeM kiba dock]'s fun and dynamic behaviour. It's dependencies are light (needs just GLib). It takes elasticity, friction, gravity into account.&lt;br /&gt;
&lt;br /&gt;
If you want to take a quick look at the code:&lt;br /&gt;
svn co http://svn.kiba-dock.org/akamaru/ akamaru&lt;br /&gt;
&lt;br /&gt;
The only (AFAIK) application using this library is kiba-dock, a *fun* app launcher, but we may find another use to it in the future.&lt;br /&gt;
&lt;br /&gt;
As suggested on the mailing list, it is mostly overkill for the uses we intend to have, but this library may be optimized already, the API can spare some time for too. Furthermore, ''Qui peut le plus, peut le moins''.&lt;br /&gt;
&lt;br /&gt;
====Verlet integration implementation from e17====&lt;br /&gt;
&lt;br /&gt;
There's an undergoing verlet integration implementation into the e17 project (by rephorm) see http://rephorm.com/news/tag/physics , so we may see some UI physics integration into e17 someday.&lt;br /&gt;
&lt;br /&gt;
====Robert Pernner's easy equations====&lt;br /&gt;
&lt;br /&gt;
http://www.robertpenner.com/easing/&lt;br /&gt;
&lt;br /&gt;
See the demo: implements non linear behaviour (actionscript), but may give inspiration&lt;br /&gt;
&lt;br /&gt;
===Extending the touchscreen capabilities and input methods===&lt;br /&gt;
&lt;br /&gt;
* '''Multitouchscreen emulation'''&lt;br /&gt;
&lt;br /&gt;
If we got it right, when touching the screen on a second place, the cursor oscillates between the two points depending on relative pressure distribution. Using averaging algorithms, we may have the opportunity to detect peculiar behaviours.&lt;br /&gt;
&lt;br /&gt;
We need raw data (x,y,t) from the real hardware for the following behaviours:&lt;br /&gt;
* slide two fingers in parallel - vertical up/down (scroll)&lt;br /&gt;
* turn the two fingers around (rotate)&lt;br /&gt;
* slide two fingers towards each other (zoom-)&lt;br /&gt;
* slide two fingers apart (zoom+)&lt;br /&gt;
&lt;br /&gt;
When touching the screen with two fingers at the same time, we necessarily see the two points, or are able to extrapolate the position of the second one. This solution can add feature, but will probably be little erratic...&lt;br /&gt;
&lt;br /&gt;
* '''Touchscreen kernel module hacking'''&lt;br /&gt;
&lt;br /&gt;
We may correct the &amp;quot;half distance&amp;quot; phenomenon on double touch: if double touch is detected, then assimilate the cursor as twice further than the first touch. It would allow finer control, but higher instability.&lt;br /&gt;
&lt;br /&gt;
The double touch detection may be implemented in the driver itself, as well as stabilization.&lt;br /&gt;
&lt;br /&gt;
* '''Other detectable behaviours'''&lt;br /&gt;
&lt;br /&gt;
The warping can be used in the 4 diagonals, plus the up/down/right/left cross:&lt;br /&gt;
&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
  - 1            -  - 1          2 -  - 1            -  -      2       -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -             2-  -              -  - 2            -  -      1       -&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
&lt;br /&gt;
It's not double touch, but two sequential presses with a short time in between (~0.5 s)&lt;br /&gt;
&lt;br /&gt;
===Improved virtual keyboard===&lt;br /&gt;
&lt;br /&gt;
One nice idea for virtual input is [http://www.micropp.se/openmoko/ finger-splash]&lt;br /&gt;
&lt;br /&gt;
Yet, optimization does not only apply to the plain one-letter-at-a-time input. We need some sort of T9 (dictionary-based input help). When typing a word, the first letter determines the next possible ones. Therefore, we may let disappear the less-probable following letters. Ex: type an L, there's no way an X follows...&lt;br /&gt;
&lt;br /&gt;
Hints: &lt;br /&gt;
* ZIP's huffmann compression applied to SMSs/mails for detecting the most used characters/words/sentences.&lt;br /&gt;
* html tag-clouds, one-letter tag clouds ; font size proportional to the probability of being used&lt;br /&gt;
&lt;br /&gt;
The most critical point is the initial disposition of the letters, before any letter is typed. We may also want to use horizontal two-parts keyboard (with the neo in hands like a psp..)&lt;br /&gt;
&lt;br /&gt;
The [http://www.strout.net/info/ideas/hexinput.html hexinput] concept is interesting. What about hiding the less probable letters and increasing the remaining ones during typing?&lt;br /&gt;
&lt;br /&gt;
===Towards OpenGL compositing===&lt;br /&gt;
&lt;br /&gt;
There are [http://www.hbmobile.org/wiki/index.php?title=GUI_Frameworks lots of possible GUI frameworks] with various software architectures that could be used for OpenMoko.&lt;br /&gt;
&lt;br /&gt;
GTA01 hardware uses GTK+/matchbox without hardware acceleration, and it's not enough: this is a first that a mobile Linux device has such a high DPI resolution. OpenGL ES compositing seems to have a bright future on embedded devices, because compositing seems to give natural zooming interfaces reality (at last!).&lt;br /&gt;
&lt;br /&gt;
Considering recent changes in destkop applications, opengl has a definite future. For instance, the expose (be it apple's or beryl's) is a very interesting and usable feature. Using compositing allows the physics metaphore: '''the human brain doesn't like &amp;quot;gaps&amp;quot;/jumps (for instance while scrolling a text), it needs continuity''', which can be provided by opengl. When you look at apple's iphone prototype, it's not just eye candy, it's maybe the most natural/human way of navigating, because it's sufficiently realistic for the brain to forget the non-physical nature of what's inside.&lt;br /&gt;
&lt;br /&gt;
So, opengl hardware will be needed in a more or less distant hardware, for 100% fluid operation. Benchmarking will be needed to compare the different alternatives that are cited further.&lt;br /&gt;
&lt;br /&gt;
====Switching to the Enlightenment Foundation Libraries====&lt;br /&gt;
&lt;br /&gt;
Evas is a powerful and power sparing canvas drawing library. It can be OpenGL accelerated. Python/Ruby bindings are available in the &amp;quot;proto&amp;quot; e17 cvs folder.&lt;br /&gt;
&lt;br /&gt;
''Moved [[E17|here]]''&lt;br /&gt;
&lt;br /&gt;
====Clutter Toolkit====&lt;br /&gt;
&lt;br /&gt;
Clutter, an [http://o-hand.com/ OpenedHand] project, is an open source software library for creating fast, visually rich graphical user interfaces. The most obvious example of potential usage is in media center type applications.&lt;br /&gt;
&lt;br /&gt;
http://clutter-project.org/&lt;br /&gt;
&lt;br /&gt;
Clutter uses OpenGL (and optionally '''OpenGL ES''') for rendering but with an API which hides the underlying GL complexity from the developer. The Clutter API is intended to be easy to use, efficient and flexible.&lt;br /&gt;
&lt;br /&gt;
It does integrate gstreamer (for easy media playback, even camera or mic inputs), allows pango text rendering, cairo graphics rendering. Provided bindings are python, C# and Ruby.&lt;br /&gt;
&lt;br /&gt;
GTK off screen rendering is supposed to be on it's way; once it is here, there will be a possibility of using GTK apps directly within OpenGL apps as textures, which would lead to the possibility of creating a full OpenGL &amp;quot;application manager&amp;quot; (as well as media consuming app) with ZUI features.&lt;br /&gt;
&lt;br /&gt;
====Graff====&lt;br /&gt;
&lt;br /&gt;
An early demonstration of Graff, which ''is a lighweight high-performance graphics rendering library.''&lt;br /&gt;
http://www.mdk.org.pl/articles/2007/04/23/chapter-1-in-which-we-meet-graff&lt;br /&gt;
&lt;br /&gt;
Be sure to check out this demo (scrolling list with inertia scrolling)&lt;br /&gt;
http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Of course it will remind you of Apple iPhone's UI. But this one runs in software mode on Nokia N770&amp;amp;800 already. The most notable part of Graff seems to be the inertia and physics integration in general.&lt;br /&gt;
&lt;br /&gt;
====Pigment API====&lt;br /&gt;
&lt;br /&gt;
Fluendo's (the Gstreamer guys) ''[https://core.fluendo.com/pigment/trac Pigment] is a Python library designed to easily build user interfaces with embedded multimedia. Its design allows to use it on several platforms, thanks to a plugin system allowing to choose the underlying graphical API. Pigment is the rendering engine of Elisa, the Fluendo Media Center project.''&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Core language: C/Python&lt;br /&gt;
* Bindings: Python&lt;br /&gt;
* Backends: DirectFB OpenGL&lt;br /&gt;
&lt;br /&gt;
===Choosing===&lt;br /&gt;
&lt;br /&gt;
Benchmarking will be needed. We have therefore to define a std testing application that would allow to compare alternatives. &lt;br /&gt;
&lt;br /&gt;
Some Clutter VS Pigment information: http://www.taimila.com/?q=node/14&lt;br /&gt;
&lt;br /&gt;
==Improvement ideas==&lt;br /&gt;
&lt;br /&gt;
Please add here any idea that seems of relevance.&lt;br /&gt;
&lt;br /&gt;
===1D list scrolling: looped physics-driven item list===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
&lt;br /&gt;
Take an item list (ex: adress book), print it on a ribbon of paper, and glue it on a wheel (on the tire). You're looking in the front of it, so when you want to go from the A to Z, you touch the wheel and drag it up. When you let the wheel go, it goes furter, taken by it's inertia. Stop the wheel when you got your contact. Got the idea? That's why we may speak of an &amp;quot;infinite wheel&amp;quot;, so that the surface is flat. For our case here, we always want to display square content, so the [http://en.wikipedia.org/wiki/Uniform_prism n-sided uniform prism] analogy is mathematically more exact.&lt;br /&gt;
&lt;br /&gt;
Important features:&lt;br /&gt;
* '''weight''': the biggest the item list, the faster it scrolls; that way, you don't have to wait too long for big lists, and you don't miss your item on shorter lists&lt;br /&gt;
* '''friction''': there is friction where the wheel is fixed, so that the wheel doesn't turn infinitely; more friction on short lists, less on big ones&lt;br /&gt;
* the '''initial speed and acceleration vector''' you give it determines it's futher rotation&lt;br /&gt;
* it's &amp;quot;round&amp;quot;/cyclic, so you can '''browse the list in two directions'''&lt;br /&gt;
* we may want to add a &amp;quot;progression indicator&amp;quot;, ex the current alphabetical letter, with a font size adequate to the proportion of the number of entries in the letter subcategory, or a reduced map of the distribution of the first letters...&lt;br /&gt;
 &lt;br /&gt;
We can add &amp;quot;parallel wheels&amp;quot;, symbolizing different sorting methods. Slide long to the left / right to look at a different wheel = items organization.&lt;br /&gt;
&lt;br /&gt;
====Controls====&lt;br /&gt;
&lt;br /&gt;
* Sliding up/down = Single click + maintained for a minimal distance&lt;br /&gt;
&lt;br /&gt;
Effect: scroll in an inverted/negated fashion (slide down = scroll up, slide up = scroll down)&lt;br /&gt;
&lt;br /&gt;
When finger is released (i.e. touchscreen doesn't detect any press):&lt;br /&gt;
  if (last_speed_seen &amp;gt; 0 ) then keep this speed and acceleration, with friction&lt;br /&gt;
  else stop scrolling&lt;br /&gt;
&lt;br /&gt;
Scrolling here is seen as unidimensional, but can apply to bidimensional situations (ex: zoomed image) too&lt;br /&gt;
&lt;br /&gt;
* Action = quick double tap&lt;br /&gt;
&lt;br /&gt;
* Details/select = short single tap&lt;br /&gt;
&lt;br /&gt;
* Right click = long tap&lt;br /&gt;
&lt;br /&gt;
* Sliding left/right: switch sorting method&lt;br /&gt;
&lt;br /&gt;
====Parts to modify====&lt;br /&gt;
&lt;br /&gt;
''Having a scroll that isn't a 1:1 map to the user's action isn't hard. It's just an extra calculation in the scroll code.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;---- Where is the scroll code? :)&lt;br /&gt;
&lt;br /&gt;
* libmokoui&lt;br /&gt;
** [[Stylus_Scrolling | Stylus scrolling widget]]&lt;br /&gt;
** [[Finger_Scrolling | Finger scrolling wheel widget]]&lt;br /&gt;
* gtk&lt;br /&gt;
** [http://www.gtk.org/api/2.6/gtk/GtkVScrollbar.html GtkVScrollbar]&lt;br /&gt;
&lt;br /&gt;
The best would be to add the feature for both finger and stylus scrolling.&lt;br /&gt;
&lt;br /&gt;
TODO:&lt;br /&gt;
* make the entire list a &amp;quot;scrolling zone&amp;quot;, i.e. an overlay transparent scrolling widget?&lt;br /&gt;
* define controls&lt;br /&gt;
* add the inertia feature&lt;br /&gt;
&lt;br /&gt;
===1D Scrolling: inertia friction integration into openmoko's finger wheel=== &lt;br /&gt;
&lt;br /&gt;
The same, but for the wheel. It can be very short to do: you don't have 1:1 anymore, but, for example, 1/4 wheel turn = 1 item. It's demultiplicated, but has inertia.&lt;br /&gt;
&lt;br /&gt;
===Left-handed UI Support===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
A discussion on the community list identified a desire to have the ability to switch the OpenMoko UI into &amp;quot;left-handed&amp;quot; mode.  &lt;br /&gt;
&lt;br /&gt;
 The main problem is scrollbars, when they're on the right, dragging  &lt;br /&gt;
 the scrollbar left handed results in your hand covering the screen so  &lt;br /&gt;
 you can't see what you are doing. So having the option of scrollbars  &lt;br /&gt;
 on the left would be useful.&lt;br /&gt;
&lt;br /&gt;
 I don't think the whole screen should be mirrored! There are some elements&lt;br /&gt;
 that should remain..like the main top bar with the status icons and such.&lt;br /&gt;
 Scrollbars are the main thing I can think of right now.&lt;br /&gt;
&lt;br /&gt;
===Handgesture recognition proposals===&lt;br /&gt;
&lt;br /&gt;
====Using simple, localized warp as modifier key====&lt;br /&gt;
&lt;br /&gt;
As discussed on community list:&lt;br /&gt;
&lt;br /&gt;
  If you hold down one finger and tap the other one, the mouse pops over and back&lt;br /&gt;
  again. If you keep your second finger touching, the cursor follows it. When you&lt;br /&gt;
  release it, cursor goes back to first finger position. This could be a way to&lt;br /&gt;
  set a bounding box or turn on the mode. So the second finger can do something&lt;br /&gt;
  like rotating around the first, or increase or lower the distance to the first.&lt;br /&gt;
&lt;br /&gt;
* the so-called &amp;quot;first touch&amp;quot; can be done on the mokowheel zone itself: put your left thumb on the black area; if you touch the screen with another finger, there is a '''warp'''; the warp is detectable and allows to enter &amp;quot;fake multi-touchscreen mode&amp;quot;&lt;br /&gt;
* afterwards,&lt;br /&gt;
     * slide your right-hand finger down, it scrolls up&lt;br /&gt;
     * slide your right-hand finger up, it scrolls down&lt;br /&gt;
     * slide it left, next page/item&lt;br /&gt;
     * slide it right, previous page/item&lt;br /&gt;
     * do a circle: rotation&lt;br /&gt;
     * narrow towards the black circle: zoom -&lt;br /&gt;
     * go away: zoom +&lt;br /&gt;
* if you had kept your first finger on the black quarter circle, you can continue issuing other gestures&lt;br /&gt;
&lt;br /&gt;
The advantages of using simple origin-driven cursor warping as double touch detection criteria is that:&lt;br /&gt;
* you don't have to use the wheel as button, which would slow things down and generate errors (false button presses)&lt;br /&gt;
* simpler detection algorithms that can pass by the fluctuation due to pressure relative distribution&lt;br /&gt;
* the space taken by the wheel itself is &amp;quot;useless&amp;quot; (i.e. displays no information); using it as modifier allows to keep the screen clean for reading&lt;br /&gt;
* the origin of this zone lets use maximum surface of the screen, allowing more fine controlling&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_rotate_right.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_previous.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_down.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_zoom-.png]]&lt;br /&gt;
&lt;br /&gt;
*Pros:&lt;br /&gt;
** who said we need multi-touch hardware?&lt;br /&gt;
** this may be the easiest way (in terms of design/implementation complexity, reliability)&lt;br /&gt;
*Cons: &lt;br /&gt;
** no matter what we'll invent, we'll need two hands for on-the-move controlling&lt;br /&gt;
** what about left-handed people?&lt;br /&gt;
&lt;br /&gt;
====What is to modify ?====&lt;br /&gt;
&lt;br /&gt;
We need to emulate key presses. We need to work at a layer where we can get raw cursor coordinates. &amp;lt;---- X server layer?&lt;br /&gt;
&lt;br /&gt;
====Full multi-touch emulation====&lt;br /&gt;
&lt;br /&gt;
Doable, but tricky...&lt;br /&gt;
&lt;br /&gt;
==Open questions==&lt;br /&gt;
&lt;br /&gt;
* will the neo/openmoko graphics system be powerful enough for such uses? I apple uses an OpenGL ES acceleration on this device (as well as on recent iPods), which is on the way with [[GTA02#.22Phase_2.22_.28GTA02.2C_.22Mass_Market.22.29|GTA02]].&lt;br /&gt;
* how does the touchscreen behave? We need a detailed touchscreen wiki information page, with visual traces. How hardware-specific is it?&lt;br /&gt;
* is multi touch really that awesome? I guess not.&lt;br /&gt;
&lt;br /&gt;
{{Languages|UI Improvements}}&lt;br /&gt;
&lt;br /&gt;
[[Category:User Interfaces| ]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/UI_Improvements</id>
		<title>UI Improvements</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/UI_Improvements"/>
				<updated>2007-07-27T16:54:40Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Pigment API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
  Obviously the tools are in the wild to build interfaces that could rival&lt;br /&gt;
  (or better IMO) anything Apple comes up with. We just need to organize&lt;br /&gt;
  this stuff. This would need hardware that can support dynamic&lt;br /&gt;
  interfaces. I can help here, too.&lt;br /&gt;
  sean@openmoko.com&lt;br /&gt;
&lt;br /&gt;
In fact, this place shall be dedicated to human-machine interactions improvements discussion;&lt;br /&gt;
&lt;br /&gt;
Human-machine interaction can be separated into several aspects:&lt;br /&gt;
* the physical contact/input device: the mono-touch touchscreen&lt;br /&gt;
* the graphics: &lt;br /&gt;
** accelerated rendering can add more consistency to zooming user interfaces, which seem to be quite an interesting concept for embedded scrensize-limited devices&lt;br /&gt;
** adding physics &amp;quot;look and feel&amp;quot; to (ex: menu's) behaviours can add coherence too&lt;br /&gt;
* the input methods&lt;br /&gt;
** the virtual keyboard&lt;br /&gt;
** handgestures&lt;br /&gt;
&lt;br /&gt;
==Finding inspiration ...==&lt;br /&gt;
&lt;br /&gt;
===Seen Live===&lt;br /&gt;
&lt;br /&gt;
'''Multi-touch'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=89sz8ExZndc Multi-Touchscreen experiments video @youtube]&lt;br /&gt;
*[http://www.youtube.com/watch?v=nPqqfVLQ_qY iPhone UI features demo @youtube]&lt;br /&gt;
&lt;br /&gt;
'''Zooming user interfaces'''&lt;br /&gt;
*[http://www.zenzui.com/products.html ZenZui], a [http://en.wikipedia.org/wiki/ZUI ZUI (zooming user interface)]&lt;br /&gt;
*[http://labs.live.com/Deepfish/videos.aspx Microsoft Bluefish's ZUI] (new mobile webbrowser)&lt;br /&gt;
*[http://googlesystem.blogspot.com/2007/04/opera-920-more-homepages-at-your.html Opera speed dial]&lt;br /&gt;
&lt;br /&gt;
'''Graphics'''&lt;br /&gt;
*[http://www.rasterman.com/files/eem.avi EEM], Rasterman's EFL libs on handelds proof of concept (doesn't DO anything, just showing off the EFLs on a handeld)&lt;br /&gt;
*[http://www.youtube.com/watch?v=8kLFPfaxQ6U&amp;amp;eurl= Nvidia's cutting-edge techno], an [http://www.khronos.org/openkode/ Openkode] demo.&lt;br /&gt;
&lt;br /&gt;
'''Science fiction'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=G_FS2TiK3AI UPMC Future?]&lt;br /&gt;
&lt;br /&gt;
'''Links:'''&lt;br /&gt;
*[http://elevate.sourceforge.net/links.html elevate project's links] sums up quite greatly the latest innovations in the desktop area&lt;br /&gt;
*[http://nooface.net/ Nooface] is a human-machine news site&lt;br /&gt;
*Asus-Intel's [http://www.hothardware.com/articles/Hands_on_with_the_ASUS_Eee/?page=2 Eee]'s interface&lt;br /&gt;
&lt;br /&gt;
===Clever hacks===&lt;br /&gt;
&lt;br /&gt;
It's been said that having no multitouch screen allows less freedom for innovation. Maybe we could get something out of our touchscreen drivers.&lt;br /&gt;
&lt;br /&gt;
Why ? Think of apple's scroll up/down feature on macbooks touchpads (which '''aren't multi touch''', it's a [http://iscroll2.sourceforge.net/ clever driver hack, iscroll2]):&lt;br /&gt;
&lt;br /&gt;
  To scroll, just place two fingers on your trackpad instead of one. Both fingers&lt;br /&gt;
  need to be placed next to each other horizontally (not vertically, the trackpad &lt;br /&gt;
  cannot detect that). Some people get better results with their finger spaced a&lt;br /&gt;
  little bit apart, while others prefer having the fingers right next to each other.&lt;br /&gt;
&lt;br /&gt;
  iScroll2 provides two scrolling modes: Linear and circular scrolling.&lt;br /&gt;
&lt;br /&gt;
  For linear scrolling, move the two fingers up/down or left/right in a straight &lt;br /&gt;
  line, respectively, to scroll in that direction.&lt;br /&gt;
&lt;br /&gt;
  Circular scrolling works in a way similar to the iPod's scroll wheel: Move the two&lt;br /&gt;
  fingers in a circle to scroll up or down, depending   on whether you move in a &lt;br /&gt;
  clockwise or counterclockwise direction.&lt;br /&gt;
&lt;br /&gt;
Maybe we can port/adapt/get inspiration from this macintosh driver.&lt;br /&gt;
&lt;br /&gt;
===n-D navigation: the polyhedra inspiration===&lt;br /&gt;
&lt;br /&gt;
When we want to navigate files, mp3s in an mp3 player, etc... Every control that the application needs is a button. What about looking at the polyhedrons? We could find one for each usage, with as many surrounding subzones that may be used as controls. Ex: you need 5 buttons, let's take a pentagon with 5 surrounding zones all around. That way, it's always optimized...&lt;br /&gt;
&lt;br /&gt;
http://en.wikipedia.org/wiki/Polyhedra&lt;br /&gt;
http://en.wikipedia.org/wiki/List_of_uniform_polyhedra&lt;br /&gt;
&lt;br /&gt;
===Our weapons===&lt;br /&gt;
&lt;br /&gt;
We can't improve the human-machine interface without knowing the strengths / weaknesses of our hardware; some of the weaknesses might turn out as exploitable features, some strengths as limiting constraints.&lt;br /&gt;
&lt;br /&gt;
====The touchscreen====&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What exactly does the touchscreen see when  you touch the screen with 2 fingers&lt;br /&gt;
  at the same time, when you move them, when you move only one of the 2, etc. I'm &lt;br /&gt;
  also interested in knowing how precise the touchscreen is (ex: refresh rate, &lt;br /&gt;
  possible pressure indication, ...)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* The output is the center of the bounding box of the touched area&lt;br /&gt;
* The touch point skips instantly on double touch&lt;br /&gt;
* Pressure has almost no effect on a single touch, but not so on a double touch. The relative pressures will cause a significant skewing effect towards the harder touch. You can easily move the pointer along the line between your two fingers by changing the relative pressure.&lt;br /&gt;
&lt;br /&gt;
Conclusions:&lt;br /&gt;
* we can detect double touch as jumps, and that's all&lt;br /&gt;
* no pressure&lt;br /&gt;
* This could be an interesting input method for games - e.g. holding the Neo in landscape view, letting each thumb rest on a specific input area; probably needs to be checked for usability with a real device&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when sliding two fingers in parallel up(L,R)-&amp;gt;down(L,R)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see a slide along the center line between your two fingers. In practice, you can't keep the pressure equal, so you will see some kind of zig-zag line somewhere between the two pressure points in the direction of your slide.&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when narrowing two fingers in slide (=zoom effect on iphone)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see the pointer stay at the center of the zoom movement. In practice, you can't keep the pressure equal for both fingers, so the pointer will move towards one of the two pressure points.&lt;br /&gt;
&lt;br /&gt;
====Graphics and computational capabilities====&lt;br /&gt;
&lt;br /&gt;
It would be good to report what performance the current hardware allows:&lt;br /&gt;
* There was no pure X11 benchmarking done (AFAIK) (how many fps at full VGA scrolling, ex: 1024*480 image scrolling?)&lt;br /&gt;
* what about the lcd reactivity? What if we don't see anything but blur while moving items fast?&lt;br /&gt;
&lt;br /&gt;
Please report here your impressions.&lt;br /&gt;
&lt;br /&gt;
==Areas of improvement==&lt;br /&gt;
&lt;br /&gt;
* OpenGL for fluid zooming interfaces (2D: the infinite sphere model, 1D: the infinite wheel of fortune/ribbon model, exposé)&lt;br /&gt;
* HandGestures&lt;br /&gt;
* Physics-model based improvements: inertia and friction&lt;br /&gt;
* multi touch screen for natural handgestures &lt;br /&gt;
* improved virtual keyboard&lt;br /&gt;
* switching to another GUI toolkit (EFLs)&lt;br /&gt;
&lt;br /&gt;
===Physics-inspired animation a.k.a. &amp;quot;Digital Physics&amp;quot;===&lt;br /&gt;
&lt;br /&gt;
If we want to add eye candy &amp;amp; usability to the UI (such as smooth realistic list scrolling, as seen in apple's&lt;br /&gt;
iphone demo on contacts lists for instance), we'll need a physics engine, so that moves &amp;amp; animations aren't all linear.&lt;br /&gt;
&lt;br /&gt;
The following aticle explains the [http://www.readwriteweb.com/archives/the_physics_of_iphone.php Digital Physics] term from the iPhone example.&lt;br /&gt;
&lt;br /&gt;
The most used technique for calculating trajectories and systems of related geometrical objects seems to be [http://en.wikipedia.org/wiki/Verlet_integration verlet integration] implementation; it is an alternative to Euler's integration method, using fast approximation. &lt;br /&gt;
&lt;br /&gt;
We may have no need for such a mathematical method at first, but perhaps there are other use cases. For instance, it may be useful to gesture recognition (i'm not aware if existing gesture recognition engines measure speed, acceleration...).&lt;br /&gt;
&lt;br /&gt;
====Open Dynamics Engine====&lt;br /&gt;
&lt;br /&gt;
ODE is an open source, high performance library for simulating rigid body dynamics. It is fully featured, stable, mature and platform independent with an easy to use C/C++ API. It has advanced joint types and integrated collision detection with friction. ODE is useful for simulating vehicles, objects in virtual reality environments and virtual creatures. It is currently used in many computer games, 3D authoring tools and simulation tools.&lt;br /&gt;
&lt;br /&gt;
http://www.ode.org/&lt;br /&gt;
&lt;br /&gt;
====Libakamaru====&lt;br /&gt;
&lt;br /&gt;
The [http://people.freedesktop.org/~krh/akamaru.git/ akamaru library] is the code behind [http://www.youtube.com/watch?v=VekgyKQoTeM kiba dock]'s fun and dynamic behaviour. It's dependencies are light (needs just GLib). It takes elasticity, friction, gravity into account.&lt;br /&gt;
&lt;br /&gt;
If you want to take a quick look at the code:&lt;br /&gt;
svn co http://svn.kiba-dock.org/akamaru/ akamaru&lt;br /&gt;
&lt;br /&gt;
The only (AFAIK) application using this library is kiba-dock, a *fun* app launcher, but we may find another use to it in the future.&lt;br /&gt;
&lt;br /&gt;
As suggested on the mailing list, it is mostly overkill for the uses we intend to have, but this library may be optimized already, the API can spare some time for too. Furthermore, ''Qui peut le plus, peut le moins''.&lt;br /&gt;
&lt;br /&gt;
====Verlet integration implementation from e17====&lt;br /&gt;
&lt;br /&gt;
There's an undergoing verlet integration implementation into the e17 project (by rephorm) see http://rephorm.com/news/tag/physics , so we may see some UI physics integration into e17 someday.&lt;br /&gt;
&lt;br /&gt;
====Robert Pernner's easy equations====&lt;br /&gt;
&lt;br /&gt;
http://www.robertpenner.com/easing/&lt;br /&gt;
&lt;br /&gt;
See the demo: implements non linear behaviour (actionscript), but may give inspiration&lt;br /&gt;
&lt;br /&gt;
===Extending the touchscreen capabilities and input methods===&lt;br /&gt;
&lt;br /&gt;
* '''Multitouchscreen emulation'''&lt;br /&gt;
&lt;br /&gt;
If we got it right, when touching the screen on a second place, the cursor oscillates between the two points depending on relative pressure distribution. Using averaging algorithms, we may have the opportunity to detect peculiar behaviours.&lt;br /&gt;
&lt;br /&gt;
We need raw data (x,y,t) from the real hardware for the following behaviours:&lt;br /&gt;
* slide two fingers in parallel - vertical up/down (scroll)&lt;br /&gt;
* turn the two fingers around (rotate)&lt;br /&gt;
* slide two fingers towards each other (zoom-)&lt;br /&gt;
* slide two fingers apart (zoom+)&lt;br /&gt;
&lt;br /&gt;
When touching the screen with two fingers at the same time, we necessarily see the two points, or are able to extrapolate the position of the second one. This solution can add feature, but will probably be little erratic...&lt;br /&gt;
&lt;br /&gt;
* '''Touchscreen kernel module hacking'''&lt;br /&gt;
&lt;br /&gt;
We may correct the &amp;quot;half distance&amp;quot; phenomenon on double touch: if double touch is detected, then assimilate the cursor as twice further than the first touch. It would allow finer control, but higher instability.&lt;br /&gt;
&lt;br /&gt;
The double touch detection may be implemented in the driver itself, as well as stabilization.&lt;br /&gt;
&lt;br /&gt;
* '''Other detectable behaviours'''&lt;br /&gt;
&lt;br /&gt;
The warping can be used in the 4 diagonals, plus the up/down/right/left cross:&lt;br /&gt;
&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
  - 1            -  - 1          2 -  - 1            -  -      2       -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -             2-  -              -  - 2            -  -      1       -&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
&lt;br /&gt;
It's not double touch, but two sequential presses with a short time in between (~0.5 s)&lt;br /&gt;
&lt;br /&gt;
===Improved virtual keyboard===&lt;br /&gt;
&lt;br /&gt;
One nice idea for virtual input is [http://www.micropp.se/openmoko/ finger-splash]&lt;br /&gt;
&lt;br /&gt;
Yet, optimization does not only apply to the plain one-letter-at-a-time input. We need some sort of T9 (dictionary-based input help). When typing a word, the first letter determines the next possible ones. Therefore, we may let disappear the less-probable following letters. Ex: type an L, there's no way an X follows...&lt;br /&gt;
&lt;br /&gt;
Hints: &lt;br /&gt;
* ZIP's huffmann compression applied to SMSs/mails for detecting the most used characters/words/sentences.&lt;br /&gt;
* html tag-clouds, one-letter tag clouds ; font size proportional to the probability of being used&lt;br /&gt;
&lt;br /&gt;
The most critical point is the initial disposition of the letters, before any letter is typed. We may also want to use horizontal two-parts keyboard (with the neo in hands like a psp..)&lt;br /&gt;
&lt;br /&gt;
The [http://www.strout.net/info/ideas/hexinput.html hexinput] concept is interesting. What about hiding the less probable letters and increasing the remaining ones during typing?&lt;br /&gt;
&lt;br /&gt;
===Towards OpenGL compositing===&lt;br /&gt;
&lt;br /&gt;
There are [http://www.hbmobile.org/wiki/index.php?title=GUI_Frameworks lots of possible GUI frameworks] with various software architectures that could be used for OpenMoko.&lt;br /&gt;
&lt;br /&gt;
GTA01 hardware uses GTK+/matchbox without hardware acceleration, and it's not enough: this is a first that a mobile Linux device has such a high DPI resolution. OpenGL ES compositing seems to have a bright future on embedded devices, because compositing seems to give natural zooming interfaces reality (at last!).&lt;br /&gt;
&lt;br /&gt;
Considering recent changes in destkop applications, opengl has a definite future. For instance, the expose (be it apple's or beryl's) is a very interesting and usable feature. Using compositing allows the physics metaphore: '''the human brain doesn't like &amp;quot;gaps&amp;quot;/jumps (for instance while scrolling a text), it needs continuity''', which can be provided by opengl. When you look at apple's iphone prototype, it's not just eye candy, it's maybe the most natural/human way of navigating, because it's sufficiently realistic for the brain to forget the non-physical nature of what's inside.&lt;br /&gt;
&lt;br /&gt;
So, opengl hardware will be needed in a more or less distant hardware, for 100% fluid operation. Benchmarking will be needed to compare the different alternatives that are cited further.&lt;br /&gt;
&lt;br /&gt;
====Switching to the Enlightenment Foundation Libraries====&lt;br /&gt;
&lt;br /&gt;
Evas is a powerful and power sparing canvas drawing library. It can be OpenGL accelerated. Python/Ruby bindings are available in the &amp;quot;proto&amp;quot; e17 cvs folder.&lt;br /&gt;
&lt;br /&gt;
''Moved [[E17|here]]''&lt;br /&gt;
&lt;br /&gt;
====Clutter Toolkit====&lt;br /&gt;
&lt;br /&gt;
Clutter, an [http://o-hand.com/ OpenedHand] project, is an open source software library for creating fast, visually rich graphical user interfaces. The most obvious example of potential usage is in media center type applications.&lt;br /&gt;
&lt;br /&gt;
http://clutter-project.org/&lt;br /&gt;
&lt;br /&gt;
Clutter uses OpenGL (and optionally '''OpenGL ES''') for rendering but with an API which hides the underlying GL complexity from the developer. The Clutter API is intended to be easy to use, efficient and flexible.&lt;br /&gt;
&lt;br /&gt;
It does integrate gstreamer (for easy media playback, even camera or mic inputs), allows pango text rendering, cairo graphics rendering. Provided bindings are python, C# and Ruby.&lt;br /&gt;
&lt;br /&gt;
GTK off screen rendering is supposed to be on it's way; once it is here, there will be a possibility of using GTK apps directly within OpenGL apps as textures, which would lead to the possibility of creating a full OpenGL &amp;quot;application manager&amp;quot; (as well as media consuming app) with ZUI features.&lt;br /&gt;
&lt;br /&gt;
====Graff====&lt;br /&gt;
&lt;br /&gt;
An early demonstration of Graff, which ''is a lighweight high-performance graphics rendering library.''&lt;br /&gt;
http://www.mdk.org.pl/articles/2007/04/23/chapter-1-in-which-we-meet-graff&lt;br /&gt;
&lt;br /&gt;
Be sure to check out this demo (scrolling list with inertia scrolling)&lt;br /&gt;
http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Of course it will remind you of Apple iPhone's UI. But this one runs in software mode on Nokia N770&amp;amp;800 already. The most notable part of Graff seems to be the inertia and physics integration in general.&lt;br /&gt;
&lt;br /&gt;
====Pigment API====&lt;br /&gt;
&lt;br /&gt;
Fluendo's (the Gstreamer guys) ''[https://core.fluendo.com/pigment/trac Pigment] is a Python library designed to easily build user interfaces with embedded multimedia. Its design allows to use it on several platforms, thanks to a plugin system allowing to choose the underlying graphical API. Pigment is the rendering engine of Elisa, the Fluendo Media Center project.''&lt;br /&gt;
&lt;br /&gt;
Core language: C/Python&lt;br /&gt;
Bindings: Python&lt;br /&gt;
Backends: DirectFB OpenGL&lt;br /&gt;
&lt;br /&gt;
===Choosing===&lt;br /&gt;
&lt;br /&gt;
Benchmarking will be needed. We have therefore to define a std testing application that would allow to compare alternatives. &lt;br /&gt;
&lt;br /&gt;
Some Clutter VS Pigment information: http://www.taimila.com/?q=node/14&lt;br /&gt;
&lt;br /&gt;
==Improvement ideas==&lt;br /&gt;
&lt;br /&gt;
Please add here any idea that seems of relevance.&lt;br /&gt;
&lt;br /&gt;
===1D list scrolling: looped physics-driven item list===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
&lt;br /&gt;
Take an item list (ex: adress book), print it on a ribbon of paper, and glue it on a wheel (on the tire). You're looking in the front of it, so when you want to go from the A to Z, you touch the wheel and drag it up. When you let the wheel go, it goes furter, taken by it's inertia. Stop the wheel when you got your contact. Got the idea? That's why we may speak of an &amp;quot;infinite wheel&amp;quot;, so that the surface is flat. For our case here, we always want to display square content, so the [http://en.wikipedia.org/wiki/Uniform_prism n-sided uniform prism] analogy is mathematically more exact.&lt;br /&gt;
&lt;br /&gt;
Important features:&lt;br /&gt;
* '''weight''': the biggest the item list, the faster it scrolls; that way, you don't have to wait too long for big lists, and you don't miss your item on shorter lists&lt;br /&gt;
* '''friction''': there is friction where the wheel is fixed, so that the wheel doesn't turn infinitely; more friction on short lists, less on big ones&lt;br /&gt;
* the '''initial speed and acceleration vector''' you give it determines it's futher rotation&lt;br /&gt;
* it's &amp;quot;round&amp;quot;/cyclic, so you can '''browse the list in two directions'''&lt;br /&gt;
* we may want to add a &amp;quot;progression indicator&amp;quot;, ex the current alphabetical letter, with a font size adequate to the proportion of the number of entries in the letter subcategory, or a reduced map of the distribution of the first letters...&lt;br /&gt;
 &lt;br /&gt;
We can add &amp;quot;parallel wheels&amp;quot;, symbolizing different sorting methods. Slide long to the left / right to look at a different wheel = items organization.&lt;br /&gt;
&lt;br /&gt;
====Controls====&lt;br /&gt;
&lt;br /&gt;
* Sliding up/down = Single click + maintained for a minimal distance&lt;br /&gt;
&lt;br /&gt;
Effect: scroll in an inverted/negated fashion (slide down = scroll up, slide up = scroll down)&lt;br /&gt;
&lt;br /&gt;
When finger is released (i.e. touchscreen doesn't detect any press):&lt;br /&gt;
  if (last_speed_seen &amp;gt; 0 ) then keep this speed and acceleration, with friction&lt;br /&gt;
  else stop scrolling&lt;br /&gt;
&lt;br /&gt;
Scrolling here is seen as unidimensional, but can apply to bidimensional situations (ex: zoomed image) too&lt;br /&gt;
&lt;br /&gt;
* Action = quick double tap&lt;br /&gt;
&lt;br /&gt;
* Details/select = short single tap&lt;br /&gt;
&lt;br /&gt;
* Right click = long tap&lt;br /&gt;
&lt;br /&gt;
* Sliding left/right: switch sorting method&lt;br /&gt;
&lt;br /&gt;
====Parts to modify====&lt;br /&gt;
&lt;br /&gt;
''Having a scroll that isn't a 1:1 map to the user's action isn't hard. It's just an extra calculation in the scroll code.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;---- Where is the scroll code? :)&lt;br /&gt;
&lt;br /&gt;
* libmokoui&lt;br /&gt;
** [[Stylus_Scrolling | Stylus scrolling widget]]&lt;br /&gt;
** [[Finger_Scrolling | Finger scrolling wheel widget]]&lt;br /&gt;
* gtk&lt;br /&gt;
** [http://www.gtk.org/api/2.6/gtk/GtkVScrollbar.html GtkVScrollbar]&lt;br /&gt;
&lt;br /&gt;
The best would be to add the feature for both finger and stylus scrolling.&lt;br /&gt;
&lt;br /&gt;
TODO:&lt;br /&gt;
* make the entire list a &amp;quot;scrolling zone&amp;quot;, i.e. an overlay transparent scrolling widget?&lt;br /&gt;
* define controls&lt;br /&gt;
* add the inertia feature&lt;br /&gt;
&lt;br /&gt;
===1D Scrolling: inertia friction integration into openmoko's finger wheel=== &lt;br /&gt;
&lt;br /&gt;
The same, but for the wheel. It can be very short to do: you don't have 1:1 anymore, but, for example, 1/4 wheel turn = 1 item. It's demultiplicated, but has inertia.&lt;br /&gt;
&lt;br /&gt;
===Left-handed UI Support===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
A discussion on the community list identified a desire to have the ability to switch the OpenMoko UI into &amp;quot;left-handed&amp;quot; mode.  &lt;br /&gt;
&lt;br /&gt;
 The main problem is scrollbars, when they're on the right, dragging  &lt;br /&gt;
 the scrollbar left handed results in your hand covering the screen so  &lt;br /&gt;
 you can't see what you are doing. So having the option of scrollbars  &lt;br /&gt;
 on the left would be useful.&lt;br /&gt;
&lt;br /&gt;
 I don't think the whole screen should be mirrored! There are some elements&lt;br /&gt;
 that should remain..like the main top bar with the status icons and such.&lt;br /&gt;
 Scrollbars are the main thing I can think of right now.&lt;br /&gt;
&lt;br /&gt;
===Handgesture recognition proposals===&lt;br /&gt;
&lt;br /&gt;
====Using simple, localized warp as modifier key====&lt;br /&gt;
&lt;br /&gt;
As discussed on community list:&lt;br /&gt;
&lt;br /&gt;
  If you hold down one finger and tap the other one, the mouse pops over and back&lt;br /&gt;
  again. If you keep your second finger touching, the cursor follows it. When you&lt;br /&gt;
  release it, cursor goes back to first finger position. This could be a way to&lt;br /&gt;
  set a bounding box or turn on the mode. So the second finger can do something&lt;br /&gt;
  like rotating around the first, or increase or lower the distance to the first.&lt;br /&gt;
&lt;br /&gt;
* the so-called &amp;quot;first touch&amp;quot; can be done on the mokowheel zone itself: put your left thumb on the black area; if you touch the screen with another finger, there is a '''warp'''; the warp is detectable and allows to enter &amp;quot;fake multi-touchscreen mode&amp;quot;&lt;br /&gt;
* afterwards,&lt;br /&gt;
     * slide your right-hand finger down, it scrolls up&lt;br /&gt;
     * slide your right-hand finger up, it scrolls down&lt;br /&gt;
     * slide it left, next page/item&lt;br /&gt;
     * slide it right, previous page/item&lt;br /&gt;
     * do a circle: rotation&lt;br /&gt;
     * narrow towards the black circle: zoom -&lt;br /&gt;
     * go away: zoom +&lt;br /&gt;
* if you had kept your first finger on the black quarter circle, you can continue issuing other gestures&lt;br /&gt;
&lt;br /&gt;
The advantages of using simple origin-driven cursor warping as double touch detection criteria is that:&lt;br /&gt;
* you don't have to use the wheel as button, which would slow things down and generate errors (false button presses)&lt;br /&gt;
* simpler detection algorithms that can pass by the fluctuation due to pressure relative distribution&lt;br /&gt;
* the space taken by the wheel itself is &amp;quot;useless&amp;quot; (i.e. displays no information); using it as modifier allows to keep the screen clean for reading&lt;br /&gt;
* the origin of this zone lets use maximum surface of the screen, allowing more fine controlling&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_rotate_right.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_previous.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_down.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_zoom-.png]]&lt;br /&gt;
&lt;br /&gt;
*Pros:&lt;br /&gt;
** who said we need multi-touch hardware?&lt;br /&gt;
** this may be the easiest way (in terms of design/implementation complexity, reliability)&lt;br /&gt;
*Cons: &lt;br /&gt;
** no matter what we'll invent, we'll need two hands for on-the-move controlling&lt;br /&gt;
** what about left-handed people?&lt;br /&gt;
&lt;br /&gt;
====What is to modify ?====&lt;br /&gt;
&lt;br /&gt;
We need to emulate key presses. We need to work at a layer where we can get raw cursor coordinates. &amp;lt;---- X server layer?&lt;br /&gt;
&lt;br /&gt;
====Full multi-touch emulation====&lt;br /&gt;
&lt;br /&gt;
Doable, but tricky...&lt;br /&gt;
&lt;br /&gt;
==Open questions==&lt;br /&gt;
&lt;br /&gt;
* will the neo/openmoko graphics system be powerful enough for such uses? I apple uses an OpenGL ES acceleration on this device (as well as on recent iPods), which is on the way with [[GTA02#.22Phase_2.22_.28GTA02.2C_.22Mass_Market.22.29|GTA02]].&lt;br /&gt;
* how does the touchscreen behave? We need a detailed touchscreen wiki information page, with visual traces. How hardware-specific is it?&lt;br /&gt;
* is multi touch really that awesome? I guess not.&lt;br /&gt;
&lt;br /&gt;
{{Languages|UI Improvements}}&lt;br /&gt;
&lt;br /&gt;
[[Category:User Interfaces| ]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/UI_Improvements</id>
		<title>UI Improvements</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/UI_Improvements"/>
				<updated>2007-07-27T16:50:37Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: Added pigment/clutter/graff info&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
  Obviously the tools are in the wild to build interfaces that could rival&lt;br /&gt;
  (or better IMO) anything Apple comes up with. We just need to organize&lt;br /&gt;
  this stuff. This would need hardware that can support dynamic&lt;br /&gt;
  interfaces. I can help here, too.&lt;br /&gt;
  sean@openmoko.com&lt;br /&gt;
&lt;br /&gt;
In fact, this place shall be dedicated to human-machine interactions improvements discussion;&lt;br /&gt;
&lt;br /&gt;
Human-machine interaction can be separated into several aspects:&lt;br /&gt;
* the physical contact/input device: the mono-touch touchscreen&lt;br /&gt;
* the graphics: &lt;br /&gt;
** accelerated rendering can add more consistency to zooming user interfaces, which seem to be quite an interesting concept for embedded scrensize-limited devices&lt;br /&gt;
** adding physics &amp;quot;look and feel&amp;quot; to (ex: menu's) behaviours can add coherence too&lt;br /&gt;
* the input methods&lt;br /&gt;
** the virtual keyboard&lt;br /&gt;
** handgestures&lt;br /&gt;
&lt;br /&gt;
==Finding inspiration ...==&lt;br /&gt;
&lt;br /&gt;
===Seen Live===&lt;br /&gt;
&lt;br /&gt;
'''Multi-touch'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=89sz8ExZndc Multi-Touchscreen experiments video @youtube]&lt;br /&gt;
*[http://www.youtube.com/watch?v=nPqqfVLQ_qY iPhone UI features demo @youtube]&lt;br /&gt;
&lt;br /&gt;
'''Zooming user interfaces'''&lt;br /&gt;
*[http://www.zenzui.com/products.html ZenZui], a [http://en.wikipedia.org/wiki/ZUI ZUI (zooming user interface)]&lt;br /&gt;
*[http://labs.live.com/Deepfish/videos.aspx Microsoft Bluefish's ZUI] (new mobile webbrowser)&lt;br /&gt;
*[http://googlesystem.blogspot.com/2007/04/opera-920-more-homepages-at-your.html Opera speed dial]&lt;br /&gt;
&lt;br /&gt;
'''Graphics'''&lt;br /&gt;
*[http://www.rasterman.com/files/eem.avi EEM], Rasterman's EFL libs on handelds proof of concept (doesn't DO anything, just showing off the EFLs on a handeld)&lt;br /&gt;
*[http://www.youtube.com/watch?v=8kLFPfaxQ6U&amp;amp;eurl= Nvidia's cutting-edge techno], an [http://www.khronos.org/openkode/ Openkode] demo.&lt;br /&gt;
&lt;br /&gt;
'''Science fiction'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=G_FS2TiK3AI UPMC Future?]&lt;br /&gt;
&lt;br /&gt;
'''Links:'''&lt;br /&gt;
*[http://elevate.sourceforge.net/links.html elevate project's links] sums up quite greatly the latest innovations in the desktop area&lt;br /&gt;
*[http://nooface.net/ Nooface] is a human-machine news site&lt;br /&gt;
*Asus-Intel's [http://www.hothardware.com/articles/Hands_on_with_the_ASUS_Eee/?page=2 Eee]'s interface&lt;br /&gt;
&lt;br /&gt;
===Clever hacks===&lt;br /&gt;
&lt;br /&gt;
It's been said that having no multitouch screen allows less freedom for innovation. Maybe we could get something out of our touchscreen drivers.&lt;br /&gt;
&lt;br /&gt;
Why ? Think of apple's scroll up/down feature on macbooks touchpads (which '''aren't multi touch''', it's a [http://iscroll2.sourceforge.net/ clever driver hack, iscroll2]):&lt;br /&gt;
&lt;br /&gt;
  To scroll, just place two fingers on your trackpad instead of one. Both fingers&lt;br /&gt;
  need to be placed next to each other horizontally (not vertically, the trackpad &lt;br /&gt;
  cannot detect that). Some people get better results with their finger spaced a&lt;br /&gt;
  little bit apart, while others prefer having the fingers right next to each other.&lt;br /&gt;
&lt;br /&gt;
  iScroll2 provides two scrolling modes: Linear and circular scrolling.&lt;br /&gt;
&lt;br /&gt;
  For linear scrolling, move the two fingers up/down or left/right in a straight &lt;br /&gt;
  line, respectively, to scroll in that direction.&lt;br /&gt;
&lt;br /&gt;
  Circular scrolling works in a way similar to the iPod's scroll wheel: Move the two&lt;br /&gt;
  fingers in a circle to scroll up or down, depending   on whether you move in a &lt;br /&gt;
  clockwise or counterclockwise direction.&lt;br /&gt;
&lt;br /&gt;
Maybe we can port/adapt/get inspiration from this macintosh driver.&lt;br /&gt;
&lt;br /&gt;
===n-D navigation: the polyhedra inspiration===&lt;br /&gt;
&lt;br /&gt;
When we want to navigate files, mp3s in an mp3 player, etc... Every control that the application needs is a button. What about looking at the polyhedrons? We could find one for each usage, with as many surrounding subzones that may be used as controls. Ex: you need 5 buttons, let's take a pentagon with 5 surrounding zones all around. That way, it's always optimized...&lt;br /&gt;
&lt;br /&gt;
http://en.wikipedia.org/wiki/Polyhedra&lt;br /&gt;
http://en.wikipedia.org/wiki/List_of_uniform_polyhedra&lt;br /&gt;
&lt;br /&gt;
===Our weapons===&lt;br /&gt;
&lt;br /&gt;
We can't improve the human-machine interface without knowing the strengths / weaknesses of our hardware; some of the weaknesses might turn out as exploitable features, some strengths as limiting constraints.&lt;br /&gt;
&lt;br /&gt;
====The touchscreen====&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What exactly does the touchscreen see when  you touch the screen with 2 fingers&lt;br /&gt;
  at the same time, when you move them, when you move only one of the 2, etc. I'm &lt;br /&gt;
  also interested in knowing how precise the touchscreen is (ex: refresh rate, &lt;br /&gt;
  possible pressure indication, ...)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* The output is the center of the bounding box of the touched area&lt;br /&gt;
* The touch point skips instantly on double touch&lt;br /&gt;
* Pressure has almost no effect on a single touch, but not so on a double touch. The relative pressures will cause a significant skewing effect towards the harder touch. You can easily move the pointer along the line between your two fingers by changing the relative pressure.&lt;br /&gt;
&lt;br /&gt;
Conclusions:&lt;br /&gt;
* we can detect double touch as jumps, and that's all&lt;br /&gt;
* no pressure&lt;br /&gt;
* This could be an interesting input method for games - e.g. holding the Neo in landscape view, letting each thumb rest on a specific input area; probably needs to be checked for usability with a real device&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when sliding two fingers in parallel up(L,R)-&amp;gt;down(L,R)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see a slide along the center line between your two fingers. In practice, you can't keep the pressure equal, so you will see some kind of zig-zag line somewhere between the two pressure points in the direction of your slide.&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when narrowing two fingers in slide (=zoom effect on iphone)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see the pointer stay at the center of the zoom movement. In practice, you can't keep the pressure equal for both fingers, so the pointer will move towards one of the two pressure points.&lt;br /&gt;
&lt;br /&gt;
====Graphics and computational capabilities====&lt;br /&gt;
&lt;br /&gt;
It would be good to report what performance the current hardware allows:&lt;br /&gt;
* There was no pure X11 benchmarking done (AFAIK) (how many fps at full VGA scrolling, ex: 1024*480 image scrolling?)&lt;br /&gt;
* what about the lcd reactivity? What if we don't see anything but blur while moving items fast?&lt;br /&gt;
&lt;br /&gt;
Please report here your impressions.&lt;br /&gt;
&lt;br /&gt;
==Areas of improvement==&lt;br /&gt;
&lt;br /&gt;
* OpenGL for fluid zooming interfaces (2D: the infinite sphere model, 1D: the infinite wheel of fortune/ribbon model, exposé)&lt;br /&gt;
* HandGestures&lt;br /&gt;
* Physics-model based improvements: inertia and friction&lt;br /&gt;
* multi touch screen for natural handgestures &lt;br /&gt;
* improved virtual keyboard&lt;br /&gt;
* switching to another GUI toolkit (EFLs)&lt;br /&gt;
&lt;br /&gt;
===Physics-inspired animation a.k.a. &amp;quot;Digital Physics&amp;quot;===&lt;br /&gt;
&lt;br /&gt;
If we want to add eye candy &amp;amp; usability to the UI (such as smooth realistic list scrolling, as seen in apple's&lt;br /&gt;
iphone demo on contacts lists for instance), we'll need a physics engine, so that moves &amp;amp; animations aren't all linear.&lt;br /&gt;
&lt;br /&gt;
The following aticle explains the [http://www.readwriteweb.com/archives/the_physics_of_iphone.php Digital Physics] term from the iPhone example.&lt;br /&gt;
&lt;br /&gt;
The most used technique for calculating trajectories and systems of related geometrical objects seems to be [http://en.wikipedia.org/wiki/Verlet_integration verlet integration] implementation; it is an alternative to Euler's integration method, using fast approximation. &lt;br /&gt;
&lt;br /&gt;
We may have no need for such a mathematical method at first, but perhaps there are other use cases. For instance, it may be useful to gesture recognition (i'm not aware if existing gesture recognition engines measure speed, acceleration...).&lt;br /&gt;
&lt;br /&gt;
====Open Dynamics Engine====&lt;br /&gt;
&lt;br /&gt;
ODE is an open source, high performance library for simulating rigid body dynamics. It is fully featured, stable, mature and platform independent with an easy to use C/C++ API. It has advanced joint types and integrated collision detection with friction. ODE is useful for simulating vehicles, objects in virtual reality environments and virtual creatures. It is currently used in many computer games, 3D authoring tools and simulation tools.&lt;br /&gt;
&lt;br /&gt;
http://www.ode.org/&lt;br /&gt;
&lt;br /&gt;
====Libakamaru====&lt;br /&gt;
&lt;br /&gt;
The [http://people.freedesktop.org/~krh/akamaru.git/ akamaru library] is the code behind [http://www.youtube.com/watch?v=VekgyKQoTeM kiba dock]'s fun and dynamic behaviour. It's dependencies are light (needs just GLib). It takes elasticity, friction, gravity into account.&lt;br /&gt;
&lt;br /&gt;
If you want to take a quick look at the code:&lt;br /&gt;
svn co http://svn.kiba-dock.org/akamaru/ akamaru&lt;br /&gt;
&lt;br /&gt;
The only (AFAIK) application using this library is kiba-dock, a *fun* app launcher, but we may find another use to it in the future.&lt;br /&gt;
&lt;br /&gt;
As suggested on the mailing list, it is mostly overkill for the uses we intend to have, but this library may be optimized already, the API can spare some time for too. Furthermore, ''Qui peut le plus, peut le moins''.&lt;br /&gt;
&lt;br /&gt;
====Verlet integration implementation from e17====&lt;br /&gt;
&lt;br /&gt;
There's an undergoing verlet integration implementation into the e17 project (by rephorm) see http://rephorm.com/news/tag/physics , so we may see some UI physics integration into e17 someday.&lt;br /&gt;
&lt;br /&gt;
====Robert Pernner's easy equations====&lt;br /&gt;
&lt;br /&gt;
http://www.robertpenner.com/easing/&lt;br /&gt;
&lt;br /&gt;
See the demo: implements non linear behaviour (actionscript), but may give inspiration&lt;br /&gt;
&lt;br /&gt;
===Extending the touchscreen capabilities and input methods===&lt;br /&gt;
&lt;br /&gt;
* '''Multitouchscreen emulation'''&lt;br /&gt;
&lt;br /&gt;
If we got it right, when touching the screen on a second place, the cursor oscillates between the two points depending on relative pressure distribution. Using averaging algorithms, we may have the opportunity to detect peculiar behaviours.&lt;br /&gt;
&lt;br /&gt;
We need raw data (x,y,t) from the real hardware for the following behaviours:&lt;br /&gt;
* slide two fingers in parallel - vertical up/down (scroll)&lt;br /&gt;
* turn the two fingers around (rotate)&lt;br /&gt;
* slide two fingers towards each other (zoom-)&lt;br /&gt;
* slide two fingers apart (zoom+)&lt;br /&gt;
&lt;br /&gt;
When touching the screen with two fingers at the same time, we necessarily see the two points, or are able to extrapolate the position of the second one. This solution can add feature, but will probably be little erratic...&lt;br /&gt;
&lt;br /&gt;
* '''Touchscreen kernel module hacking'''&lt;br /&gt;
&lt;br /&gt;
We may correct the &amp;quot;half distance&amp;quot; phenomenon on double touch: if double touch is detected, then assimilate the cursor as twice further than the first touch. It would allow finer control, but higher instability.&lt;br /&gt;
&lt;br /&gt;
The double touch detection may be implemented in the driver itself, as well as stabilization.&lt;br /&gt;
&lt;br /&gt;
* '''Other detectable behaviours'''&lt;br /&gt;
&lt;br /&gt;
The warping can be used in the 4 diagonals, plus the up/down/right/left cross:&lt;br /&gt;
&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
  - 1            -  - 1          2 -  - 1            -  -      2       -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -             2-  -              -  - 2            -  -      1       -&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
&lt;br /&gt;
It's not double touch, but two sequential presses with a short time in between (~0.5 s)&lt;br /&gt;
&lt;br /&gt;
===Improved virtual keyboard===&lt;br /&gt;
&lt;br /&gt;
One nice idea for virtual input is [http://www.micropp.se/openmoko/ finger-splash]&lt;br /&gt;
&lt;br /&gt;
Yet, optimization does not only apply to the plain one-letter-at-a-time input. We need some sort of T9 (dictionary-based input help). When typing a word, the first letter determines the next possible ones. Therefore, we may let disappear the less-probable following letters. Ex: type an L, there's no way an X follows...&lt;br /&gt;
&lt;br /&gt;
Hints: &lt;br /&gt;
* ZIP's huffmann compression applied to SMSs/mails for detecting the most used characters/words/sentences.&lt;br /&gt;
* html tag-clouds, one-letter tag clouds ; font size proportional to the probability of being used&lt;br /&gt;
&lt;br /&gt;
The most critical point is the initial disposition of the letters, before any letter is typed. We may also want to use horizontal two-parts keyboard (with the neo in hands like a psp..)&lt;br /&gt;
&lt;br /&gt;
The [http://www.strout.net/info/ideas/hexinput.html hexinput] concept is interesting. What about hiding the less probable letters and increasing the remaining ones during typing?&lt;br /&gt;
&lt;br /&gt;
===Towards OpenGL compositing===&lt;br /&gt;
&lt;br /&gt;
There are [http://www.hbmobile.org/wiki/index.php?title=GUI_Frameworks lots of possible GUI frameworks] with various software architectures that could be used for OpenMoko.&lt;br /&gt;
&lt;br /&gt;
GTA01 hardware uses GTK+/matchbox without hardware acceleration, and it's not enough: this is a first that a mobile Linux device has such a high DPI resolution. OpenGL ES compositing seems to have a bright future on embedded devices, because compositing seems to give natural zooming interfaces reality (at last!).&lt;br /&gt;
&lt;br /&gt;
Considering recent changes in destkop applications, opengl has a definite future. For instance, the expose (be it apple's or beryl's) is a very interesting and usable feature. Using compositing allows the physics metaphore: '''the human brain doesn't like &amp;quot;gaps&amp;quot;/jumps (for instance while scrolling a text), it needs continuity''', which can be provided by opengl. When you look at apple's iphone prototype, it's not just eye candy, it's maybe the most natural/human way of navigating, because it's sufficiently realistic for the brain to forget the non-physical nature of what's inside.&lt;br /&gt;
&lt;br /&gt;
So, opengl hardware will be needed in a more or less distant hardware, for 100% fluid operation. Benchmarking will be needed to compare the different alternatives that are cited further.&lt;br /&gt;
&lt;br /&gt;
====Switching to the Enlightenment Foundation Libraries====&lt;br /&gt;
&lt;br /&gt;
Evas is a powerful and power sparing canvas drawing library. It can be OpenGL accelerated. Python/Ruby bindings are available in the &amp;quot;proto&amp;quot; e17 cvs folder.&lt;br /&gt;
&lt;br /&gt;
''Moved [[E17|here]]''&lt;br /&gt;
&lt;br /&gt;
====Clutter Toolkit====&lt;br /&gt;
&lt;br /&gt;
Clutter, an [http://o-hand.com/ OpenedHand] project, is an open source software library for creating fast, visually rich graphical user interfaces. The most obvious example of potential usage is in media center type applications.&lt;br /&gt;
&lt;br /&gt;
http://clutter-project.org/&lt;br /&gt;
&lt;br /&gt;
Clutter uses OpenGL (and optionally '''OpenGL ES''') for rendering but with an API which hides the underlying GL complexity from the developer. The Clutter API is intended to be easy to use, efficient and flexible.&lt;br /&gt;
&lt;br /&gt;
It does integrate gstreamer (for easy media playback, even camera or mic inputs), allows pango text rendering, cairo graphics rendering. Provided bindings are python, C# and Ruby.&lt;br /&gt;
&lt;br /&gt;
GTK off screen rendering is supposed to be on it's way; once it is here, there will be a possibility of using GTK apps directly within OpenGL apps as textures, which would lead to the possibility of creating a full OpenGL &amp;quot;application manager&amp;quot; (as well as media consuming app) with ZUI features.&lt;br /&gt;
&lt;br /&gt;
====Graff====&lt;br /&gt;
&lt;br /&gt;
An early demonstration of Graff, which ''is a lighweight high-performance graphics rendering library.''&lt;br /&gt;
http://www.mdk.org.pl/articles/2007/04/23/chapter-1-in-which-we-meet-graff&lt;br /&gt;
&lt;br /&gt;
Be sure to check out this demo (scrolling list with inertia scrolling)&lt;br /&gt;
http://files.mdk.am/demos/graff-demo-3.avi&lt;br /&gt;
&lt;br /&gt;
Of course it will remind you of Apple iPhone's UI. But this one runs in software mode on Nokia N770&amp;amp;800 already. The most notable part of Graff seems to be the inertia and physics integration in general.&lt;br /&gt;
&lt;br /&gt;
====Pigment API====&lt;br /&gt;
&lt;br /&gt;
''Pigment is a Python library designed to easily build user interfaces with embedded multimedia. Its design allows to use it on several platforms, thanks to a plugin system allowing to choose the underlying graphical API. Pigment is the rendering engine of Elisa, the Fluendo Media Center project.''&lt;br /&gt;
&lt;br /&gt;
===Choosing===&lt;br /&gt;
&lt;br /&gt;
Benchmarking will be needed. We have therefore to define a std testing application that would allow to compare alternatives. &lt;br /&gt;
&lt;br /&gt;
Some Clutter VS Pigment information: http://www.taimila.com/?q=node/14&lt;br /&gt;
&lt;br /&gt;
==Improvement ideas==&lt;br /&gt;
&lt;br /&gt;
Please add here any idea that seems of relevance.&lt;br /&gt;
&lt;br /&gt;
===1D list scrolling: looped physics-driven item list===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
&lt;br /&gt;
Take an item list (ex: adress book), print it on a ribbon of paper, and glue it on a wheel (on the tire). You're looking in the front of it, so when you want to go from the A to Z, you touch the wheel and drag it up. When you let the wheel go, it goes furter, taken by it's inertia. Stop the wheel when you got your contact. Got the idea? That's why we may speak of an &amp;quot;infinite wheel&amp;quot;, so that the surface is flat. For our case here, we always want to display square content, so the [http://en.wikipedia.org/wiki/Uniform_prism n-sided uniform prism] analogy is mathematically more exact.&lt;br /&gt;
&lt;br /&gt;
Important features:&lt;br /&gt;
* '''weight''': the biggest the item list, the faster it scrolls; that way, you don't have to wait too long for big lists, and you don't miss your item on shorter lists&lt;br /&gt;
* '''friction''': there is friction where the wheel is fixed, so that the wheel doesn't turn infinitely; more friction on short lists, less on big ones&lt;br /&gt;
* the '''initial speed and acceleration vector''' you give it determines it's futher rotation&lt;br /&gt;
* it's &amp;quot;round&amp;quot;/cyclic, so you can '''browse the list in two directions'''&lt;br /&gt;
* we may want to add a &amp;quot;progression indicator&amp;quot;, ex the current alphabetical letter, with a font size adequate to the proportion of the number of entries in the letter subcategory, or a reduced map of the distribution of the first letters...&lt;br /&gt;
 &lt;br /&gt;
We can add &amp;quot;parallel wheels&amp;quot;, symbolizing different sorting methods. Slide long to the left / right to look at a different wheel = items organization.&lt;br /&gt;
&lt;br /&gt;
====Controls====&lt;br /&gt;
&lt;br /&gt;
* Sliding up/down = Single click + maintained for a minimal distance&lt;br /&gt;
&lt;br /&gt;
Effect: scroll in an inverted/negated fashion (slide down = scroll up, slide up = scroll down)&lt;br /&gt;
&lt;br /&gt;
When finger is released (i.e. touchscreen doesn't detect any press):&lt;br /&gt;
  if (last_speed_seen &amp;gt; 0 ) then keep this speed and acceleration, with friction&lt;br /&gt;
  else stop scrolling&lt;br /&gt;
&lt;br /&gt;
Scrolling here is seen as unidimensional, but can apply to bidimensional situations (ex: zoomed image) too&lt;br /&gt;
&lt;br /&gt;
* Action = quick double tap&lt;br /&gt;
&lt;br /&gt;
* Details/select = short single tap&lt;br /&gt;
&lt;br /&gt;
* Right click = long tap&lt;br /&gt;
&lt;br /&gt;
* Sliding left/right: switch sorting method&lt;br /&gt;
&lt;br /&gt;
====Parts to modify====&lt;br /&gt;
&lt;br /&gt;
''Having a scroll that isn't a 1:1 map to the user's action isn't hard. It's just an extra calculation in the scroll code.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;---- Where is the scroll code? :)&lt;br /&gt;
&lt;br /&gt;
* libmokoui&lt;br /&gt;
** [[Stylus_Scrolling | Stylus scrolling widget]]&lt;br /&gt;
** [[Finger_Scrolling | Finger scrolling wheel widget]]&lt;br /&gt;
* gtk&lt;br /&gt;
** [http://www.gtk.org/api/2.6/gtk/GtkVScrollbar.html GtkVScrollbar]&lt;br /&gt;
&lt;br /&gt;
The best would be to add the feature for both finger and stylus scrolling.&lt;br /&gt;
&lt;br /&gt;
TODO:&lt;br /&gt;
* make the entire list a &amp;quot;scrolling zone&amp;quot;, i.e. an overlay transparent scrolling widget?&lt;br /&gt;
* define controls&lt;br /&gt;
* add the inertia feature&lt;br /&gt;
&lt;br /&gt;
===1D Scrolling: inertia friction integration into openmoko's finger wheel=== &lt;br /&gt;
&lt;br /&gt;
The same, but for the wheel. It can be very short to do: you don't have 1:1 anymore, but, for example, 1/4 wheel turn = 1 item. It's demultiplicated, but has inertia.&lt;br /&gt;
&lt;br /&gt;
===Left-handed UI Support===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
A discussion on the community list identified a desire to have the ability to switch the OpenMoko UI into &amp;quot;left-handed&amp;quot; mode.  &lt;br /&gt;
&lt;br /&gt;
 The main problem is scrollbars, when they're on the right, dragging  &lt;br /&gt;
 the scrollbar left handed results in your hand covering the screen so  &lt;br /&gt;
 you can't see what you are doing. So having the option of scrollbars  &lt;br /&gt;
 on the left would be useful.&lt;br /&gt;
&lt;br /&gt;
 I don't think the whole screen should be mirrored! There are some elements&lt;br /&gt;
 that should remain..like the main top bar with the status icons and such.&lt;br /&gt;
 Scrollbars are the main thing I can think of right now.&lt;br /&gt;
&lt;br /&gt;
===Handgesture recognition proposals===&lt;br /&gt;
&lt;br /&gt;
====Using simple, localized warp as modifier key====&lt;br /&gt;
&lt;br /&gt;
As discussed on community list:&lt;br /&gt;
&lt;br /&gt;
  If you hold down one finger and tap the other one, the mouse pops over and back&lt;br /&gt;
  again. If you keep your second finger touching, the cursor follows it. When you&lt;br /&gt;
  release it, cursor goes back to first finger position. This could be a way to&lt;br /&gt;
  set a bounding box or turn on the mode. So the second finger can do something&lt;br /&gt;
  like rotating around the first, or increase or lower the distance to the first.&lt;br /&gt;
&lt;br /&gt;
* the so-called &amp;quot;first touch&amp;quot; can be done on the mokowheel zone itself: put your left thumb on the black area; if you touch the screen with another finger, there is a '''warp'''; the warp is detectable and allows to enter &amp;quot;fake multi-touchscreen mode&amp;quot;&lt;br /&gt;
* afterwards,&lt;br /&gt;
     * slide your right-hand finger down, it scrolls up&lt;br /&gt;
     * slide your right-hand finger up, it scrolls down&lt;br /&gt;
     * slide it left, next page/item&lt;br /&gt;
     * slide it right, previous page/item&lt;br /&gt;
     * do a circle: rotation&lt;br /&gt;
     * narrow towards the black circle: zoom -&lt;br /&gt;
     * go away: zoom +&lt;br /&gt;
* if you had kept your first finger on the black quarter circle, you can continue issuing other gestures&lt;br /&gt;
&lt;br /&gt;
The advantages of using simple origin-driven cursor warping as double touch detection criteria is that:&lt;br /&gt;
* you don't have to use the wheel as button, which would slow things down and generate errors (false button presses)&lt;br /&gt;
* simpler detection algorithms that can pass by the fluctuation due to pressure relative distribution&lt;br /&gt;
* the space taken by the wheel itself is &amp;quot;useless&amp;quot; (i.e. displays no information); using it as modifier allows to keep the screen clean for reading&lt;br /&gt;
* the origin of this zone lets use maximum surface of the screen, allowing more fine controlling&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_rotate_right.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_previous.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_down.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_zoom-.png]]&lt;br /&gt;
&lt;br /&gt;
*Pros:&lt;br /&gt;
** who said we need multi-touch hardware?&lt;br /&gt;
** this may be the easiest way (in terms of design/implementation complexity, reliability)&lt;br /&gt;
*Cons: &lt;br /&gt;
** no matter what we'll invent, we'll need two hands for on-the-move controlling&lt;br /&gt;
** what about left-handed people?&lt;br /&gt;
&lt;br /&gt;
====What is to modify ?====&lt;br /&gt;
&lt;br /&gt;
We need to emulate key presses. We need to work at a layer where we can get raw cursor coordinates. &amp;lt;---- X server layer?&lt;br /&gt;
&lt;br /&gt;
====Full multi-touch emulation====&lt;br /&gt;
&lt;br /&gt;
Doable, but tricky...&lt;br /&gt;
&lt;br /&gt;
==Open questions==&lt;br /&gt;
&lt;br /&gt;
* will the neo/openmoko graphics system be powerful enough for such uses? I apple uses an OpenGL ES acceleration on this device (as well as on recent iPods), which is on the way with [[GTA02#.22Phase_2.22_.28GTA02.2C_.22Mass_Market.22.29|GTA02]].&lt;br /&gt;
* how does the touchscreen behave? We need a detailed touchscreen wiki information page, with visual traces. How hardware-specific is it?&lt;br /&gt;
* is multi touch really that awesome? I guess not.&lt;br /&gt;
&lt;br /&gt;
{{Languages|UI Improvements}}&lt;br /&gt;
&lt;br /&gt;
[[Category:User Interfaces| ]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/User:Fthiery</id>
		<title>User:Fthiery</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/User:Fthiery"/>
				<updated>2007-07-27T16:30:51Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;http://wiki.openmoko.org/wiki/Wishlist:LiveUSB_distro&lt;br /&gt;
http://wiki.openmoko.org/wiki/UI_Improvements&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Openmoko_Local_Groups:_Paris</id>
		<title>Openmoko Local Groups: Paris</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Openmoko_Local_Groups:_Paris"/>
				<updated>2007-07-27T16:29:35Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;IDF - Paris&lt;br /&gt;
&lt;br /&gt;
{|border=1&lt;br /&gt;
!Name&lt;br /&gt;
!Skills&lt;br /&gt;
!Interest&lt;br /&gt;
!Location&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Fthiery|Florent Thiery]]&lt;br /&gt;
|Software architecture,Bash,Python&lt;br /&gt;
|Application development&lt;br /&gt;
|Evry(91)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Community]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Openmoko_Local_Groups</id>
		<title>Openmoko Local Groups</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Openmoko_Local_Groups"/>
				<updated>2007-07-27T16:26:37Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: Paris local group&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
'''OpenMoko Local Groups...'''&lt;br /&gt;
&lt;br /&gt;
* can be used for developers to meet and get to know each other&lt;br /&gt;
* can be used for developing&lt;br /&gt;
* may provide the room for real-life discussions away from mailinglists/wiki&lt;br /&gt;
* can support early support handling their GTA01Bv4 and exchange experiences&lt;br /&gt;
* fasten the community's cohesion&lt;br /&gt;
* give motivation&lt;br /&gt;
&lt;br /&gt;
== EU ==&lt;br /&gt;
&lt;br /&gt;
* Austria&lt;br /&gt;
** [[OpenMoko_Local_Groups: Vienna|Vienna]] &lt;br /&gt;
&lt;br /&gt;
* Belgium&lt;br /&gt;
** [[OpenMoko_local_Groups: Antwerp|Antwerp]]&lt;br /&gt;
&lt;br /&gt;
* Finland &lt;br /&gt;
** [[OpenMoko_Local_Groups: Helsinki|Helsinki]] &lt;br /&gt;
&lt;br /&gt;
* France &lt;br /&gt;
** [[OpenMoko_Local_Groups: Paris|Paris]]&lt;br /&gt;
** [[OpenMoko_Local_Groups: Toulouse|Toulouse]] &lt;br /&gt;
&lt;br /&gt;
* Germany &lt;br /&gt;
** [[OpenMoko_Local_Groups: Berlin|Berlin]]&lt;br /&gt;
** [[OpenMoko_Local_Groups: Braunschweig|Braunschweig]]&lt;br /&gt;
** [[OpenMoko_Local_Groups: Duesseldorf|Duesseldorf]] &lt;br /&gt;
** [[OpenMoko_Local_Groups: Frankfurt Main|Frankfurt Main]] &lt;br /&gt;
** [[OpenMoko_Local_Groups: OWL|OWL]]&lt;br /&gt;
&lt;br /&gt;
* [[OpenMoko_Local_Groups:_Netherlands|Netherlands]] &lt;br /&gt;
** [[OpenMoko_Local_Groups: Amsterdam|Amsterdam]] &lt;br /&gt;
** [[OpenMoko_Local_Groups: Den Haag|Den Haag/The Hague]] &lt;br /&gt;
** [[OpenMoko_Local_Groups: Eindhoven|Eindhoven]] &lt;br /&gt;
** [[OpenMoko_Local_Groups: Ede|Ede]]&lt;br /&gt;
&lt;br /&gt;
* Italy&lt;br /&gt;
** [[OpenMoko_Local_Groups: Milan|Milan]] &lt;br /&gt;
&lt;br /&gt;
* [[OpenMoko_Local_Groups:_Norway|Norway]]&lt;br /&gt;
** [[OpenMoko_Local_Groups: Trondheim|Trondheim]] &lt;br /&gt;
&lt;br /&gt;
* Poland &lt;br /&gt;
** [[OpenMoko_Local_Groups: Warsaw|Warsaw]] &lt;br /&gt;
&lt;br /&gt;
* Portugal &lt;br /&gt;
** [[OpenMoko_Local_Groups: Braga|Braga]] &lt;br /&gt;
&lt;br /&gt;
* Romania&lt;br /&gt;
** [[OpenMoko_Local_Groups: Bucharest|Bucharest]]&lt;br /&gt;
&lt;br /&gt;
* Spain &lt;br /&gt;
** [[OpenMoko_Local_Groups: Madrid|Madrid]] &lt;br /&gt;
&lt;br /&gt;
* Sweden &lt;br /&gt;
** [[OpenMoko_Local_Groups: Gothenburg|Gothenburg]] &lt;br /&gt;
&lt;br /&gt;
* [[OpenMoko_Local_Groups: Switzerland|Switzerland]]&lt;br /&gt;
** [[OpenMoko_Local_Groups: Bern|Bern]] &lt;br /&gt;
&lt;br /&gt;
* UK&lt;br /&gt;
** England&lt;br /&gt;
*** [[OpenMoko_Local_Groups: Birmingham|Birmingham]] &lt;br /&gt;
*** [[OpenMoko_Local_Groups: London|London]]&lt;br /&gt;
** Scotland&lt;br /&gt;
*** [[OpenMoko_Local_Groups: Fife|Fife]]&lt;br /&gt;
*** [[OpenMoko_Local_Groups: Edinburgh|Edinburgh]]&lt;br /&gt;
&lt;br /&gt;
== Oceania ==&lt;br /&gt;
&lt;br /&gt;
* Australia &lt;br /&gt;
** [[OpenMoko_Local_Groups: Adelaide|Adelaide]]&lt;br /&gt;
** [[OpenMoko_Local_Groups: Canberra|Canberra]]&lt;br /&gt;
&lt;br /&gt;
* New Zealand&lt;br /&gt;
** [[OpenMoko_Local_Groups: Auckland|Auckland]]&lt;br /&gt;
** [[OpenMoko_Local_Groups: Christchurch|Christchurch]]&lt;br /&gt;
&lt;br /&gt;
== Asia ==&lt;br /&gt;
* India&lt;br /&gt;
** [[OpenMoko_Local_Groups: Delhi|Delhi]]&lt;br /&gt;
&lt;br /&gt;
== USA ==&lt;br /&gt;
* Arizona&lt;br /&gt;
** [[OpenMoko_Local_Groups: Arizona|Arizona]]&lt;br /&gt;
&lt;br /&gt;
* California &lt;br /&gt;
** [[OpenMoko_Local_Groups: San Diego|San Diego]] &lt;br /&gt;
** [[OpenMoko_Local_Groups: San Francisco|San Francisco]] &lt;br /&gt;
** [[OpenMoko_Local_Groups: Sacramento|Sacramento]]&lt;br /&gt;
&lt;br /&gt;
* Colorado&lt;br /&gt;
** [[OpenMoko_Local_Groups: Colorado Springs|Colorado Springs]]&lt;br /&gt;
&lt;br /&gt;
* District of Columbia&lt;br /&gt;
** [[OpenMoko_Local_Groups: Washington DC Metro | Washington DC Metro]]&lt;br /&gt;
&lt;br /&gt;
* Florida&lt;br /&gt;
** [[OpenMoko_Local_Groups: Central Florida | Central Florida]]&lt;br /&gt;
&lt;br /&gt;
* Georgia&lt;br /&gt;
** [[OpenMoko_Local_Groups: Atlanta | Atlanta]]&lt;br /&gt;
&lt;br /&gt;
* Illinois &lt;br /&gt;
** [[OpenMoko_Local_Groups: Chicago|Chicago]]&lt;br /&gt;
&lt;br /&gt;
* Indiana&lt;br /&gt;
** [[OpenMoko_Local_Groups: Bloomington|Bloomington]]&lt;br /&gt;
&lt;br /&gt;
* Iowa&lt;br /&gt;
** [[OpenMoko_Local_Groups: Iowa-Ames | Iowa-Ames]] &lt;br /&gt;
&lt;br /&gt;
* Massachusetts&lt;br /&gt;
** [[OpenMoko_Local_groups: Boston|Boston]]&lt;br /&gt;
&lt;br /&gt;
* Michigan &lt;br /&gt;
** [[OpenMoko_Local_Groups: Detroit|Detroit]] &lt;br /&gt;
&lt;br /&gt;
* New Jersey&lt;br /&gt;
** [[OpenMoko_Local_Groups: Stevens Institute of Technology, Hoboken NJ | Stevens Institute of Technology, Hoboken NJ  ]]&lt;br /&gt;
&lt;br /&gt;
* New York&lt;br /&gt;
** [[OpenMoko_Local_Groups: NYC Metro | NYC Metro]]&lt;br /&gt;
&lt;br /&gt;
* North Carolina&lt;br /&gt;
** [[OpenMoko Local_Groups: Charlotte | Charlotte]]&lt;br /&gt;
&lt;br /&gt;
* Ohio &lt;br /&gt;
** [[OpenMoko_Local_Groups: Cleveland|Cleveland]] &lt;br /&gt;
&lt;br /&gt;
* Oregon &lt;br /&gt;
** [[OpenMoko_Local_Groups: Eugene|Eugene]] &lt;br /&gt;
** [[OpenMoko_Local_Groups: Portland|Portland]] &lt;br /&gt;
&lt;br /&gt;
* Texas &lt;br /&gt;
** [[OpenMoko_Local_Groups: North Texas|North Texas]]&lt;br /&gt;
&lt;br /&gt;
* Utah&lt;br /&gt;
** [[OpenMoko_Local_Groups: Salt Lake|Salt Lake]]&lt;br /&gt;
&lt;br /&gt;
* Virginia&lt;br /&gt;
** [[OpenMoko_Local_Groups: Virginia|Virginia]]&lt;br /&gt;
&lt;br /&gt;
== Canada ==&lt;br /&gt;
* Alberta&lt;br /&gt;
** [[OpenMoko_Local_Groups: Edmonton|Edmonton]]&lt;br /&gt;
** [[OpenMoko_Local_Groups: Pincher Creek|Pincher Creek]]&lt;br /&gt;
* British Columbia&lt;br /&gt;
** [[OpenMoko_Local_Groups: Vancouver|Vancouver]]&lt;br /&gt;
* Ontario&lt;br /&gt;
** [[OpenMoko_Local_Groups: Ottawa|Ottawa]]&lt;br /&gt;
** [[OpenMoko_Local_Groups: Toronto|Toronto]]&lt;br /&gt;
* Quebec &lt;br /&gt;
** [[OpenMoko_Local_Groups: Montreal|Montreal]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Community]]&lt;br /&gt;
[[Category:Neo1973 Phase 1 related]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/UI_Improvements</id>
		<title>UI Improvements</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/UI_Improvements"/>
				<updated>2007-07-10T14:13:54Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: Added digital phisics readwriteweb article&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
  Obviously the tools are in the wild to build interfaces that could rival&lt;br /&gt;
  (or better IMO) anything Apple comes up with. We just need to organize&lt;br /&gt;
  this stuff. This would need hardware that can support dynamic&lt;br /&gt;
  interfaces. I can help here, too.&lt;br /&gt;
  sean@openmoko.com&lt;br /&gt;
&lt;br /&gt;
In fact, this place shall be dedicated to human-machine interactions improvements discussion;&lt;br /&gt;
&lt;br /&gt;
Human-machine interaction can be separated into several aspects:&lt;br /&gt;
* the physical contact/input device: the mono-touch touchscreen&lt;br /&gt;
* the graphics: &lt;br /&gt;
** accelerated rendering can add more consistency to zooming user interfaces, which seem to be quite an interesting concept for embedded scrensize-limited devices&lt;br /&gt;
** adding physics &amp;quot;look and feel&amp;quot; to (ex: menu's) behaviours can add coherence too&lt;br /&gt;
* the input methods&lt;br /&gt;
** the virtual keyboard&lt;br /&gt;
** handgestures&lt;br /&gt;
&lt;br /&gt;
==Finding inspiration ...==&lt;br /&gt;
&lt;br /&gt;
===Seen Live===&lt;br /&gt;
&lt;br /&gt;
'''Multi-touch'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=89sz8ExZndc Multi-Touchscreen experiments video @youtube]&lt;br /&gt;
*[http://www.youtube.com/watch?v=nPqqfVLQ_qY iPhone UI features demo @youtube]&lt;br /&gt;
&lt;br /&gt;
'''Zooming user interfaces'''&lt;br /&gt;
*[http://www.zenzui.com/products.html ZenZui], a [http://en.wikipedia.org/wiki/ZUI ZUI (zooming user interface)]&lt;br /&gt;
*[http://labs.live.com/Deepfish/videos.aspx Microsoft Bluefish's ZUI] (new mobile webbrowser)&lt;br /&gt;
*[http://googlesystem.blogspot.com/2007/04/opera-920-more-homepages-at-your.html Opera speed dial]&lt;br /&gt;
&lt;br /&gt;
'''Graphics'''&lt;br /&gt;
*[http://www.rasterman.com/files/eem.avi EEM], Rasterman's EFL libs on handelds proof of concept (doesn't DO anything, just showing off the EFLs on a handeld)&lt;br /&gt;
*[http://www.youtube.com/watch?v=8kLFPfaxQ6U&amp;amp;eurl= Nvidia's cutting-edge techno], an [http://www.khronos.org/openkode/ Openkode] demo.&lt;br /&gt;
&lt;br /&gt;
'''Science fiction'''&lt;br /&gt;
*[http://www.youtube.com/watch?v=G_FS2TiK3AI UPMC Future?]&lt;br /&gt;
&lt;br /&gt;
'''Links:'''&lt;br /&gt;
*[http://elevate.sourceforge.net/links.html elevate project's links] sums up quite greatly the latest innovations in the desktop area&lt;br /&gt;
*[http://nooface.net/ Nooface] is a human-machine news site&lt;br /&gt;
*Asus-Intel's [http://www.hothardware.com/articles/Hands_on_with_the_ASUS_Eee/?page=2 Eee]'s interface&lt;br /&gt;
&lt;br /&gt;
===Clever hacks===&lt;br /&gt;
&lt;br /&gt;
It's been said that having no multitouch screen allows less freedom for innovation. Maybe we could get something out of our touchscreen drivers.&lt;br /&gt;
&lt;br /&gt;
Why ? Think of apple's scroll up/down feature on macbooks touchpads (which '''aren't multi touch''', it's a [http://iscroll2.sourceforge.net/ clever driver hack, iscroll2]):&lt;br /&gt;
&lt;br /&gt;
  To scroll, just place two fingers on your trackpad instead of one. Both fingers&lt;br /&gt;
  need to be placed next to each other horizontally (not vertically, the trackpad &lt;br /&gt;
  cannot detect that). Some people get better results with their finger spaced a&lt;br /&gt;
  little bit apart, while others prefer having the fingers right next to each other.&lt;br /&gt;
&lt;br /&gt;
  iScroll2 provides two scrolling modes: Linear and circular scrolling.&lt;br /&gt;
&lt;br /&gt;
  For linear scrolling, move the two fingers up/down or left/right in a straight &lt;br /&gt;
  line, respectively, to scroll in that direction.&lt;br /&gt;
&lt;br /&gt;
  Circular scrolling works in a way similar to the iPod's scroll wheel: Move the two&lt;br /&gt;
  fingers in a circle to scroll up or down, depending   on whether you move in a &lt;br /&gt;
  clockwise or counterclockwise direction.&lt;br /&gt;
&lt;br /&gt;
Maybe we can port/adapt/get inspiration from this macintosh driver.&lt;br /&gt;
&lt;br /&gt;
===n-D navigation: the polyhedra inspiration===&lt;br /&gt;
&lt;br /&gt;
When we want to navigate files, mp3s in an mp3 player, etc... Every control that the application needs is a button. What about looking at the polyhedrons? We could find one for each usage, with as many surrounding subzones that way be used as controls. Ex: you need 5 buttons, let's take a pentagon with 5 surrounding zones all around. That way, it's always optimized...&lt;br /&gt;
&lt;br /&gt;
http://en.wikipedia.org/wiki/Polyhedra&lt;br /&gt;
http://en.wikipedia.org/wiki/List_of_uniform_polyhedra&lt;br /&gt;
&lt;br /&gt;
===Our weapons===&lt;br /&gt;
&lt;br /&gt;
We can't improve the human-machine interface without knowing the strenghts / weaknesses of our hardware; some of the weaknesses might turn out as exploitable features, some strengths as limiting constraints.&lt;br /&gt;
&lt;br /&gt;
====The touchscreen====&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What exactly does the touchscreen see when  you touch the screen with 2 fingers&lt;br /&gt;
  at the same time, when you move them, when you move only one of the 2, etc. I'm &lt;br /&gt;
  also interested in knowing how precise the touchscreen is (ex: refresh rate, &lt;br /&gt;
  possible pressure indication, ...)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* The output is the center of the bounding box of the touched area&lt;br /&gt;
* The touch point skips instantly on double touch&lt;br /&gt;
* Pressure has almost no effect on a single touch, but not so on a double touch. The relative pressures will cause a significant skewing effect towards the harder touch. You can easily move the pointer along the line between your two fingers by changing the relative pressure.&lt;br /&gt;
&lt;br /&gt;
Conclusions:&lt;br /&gt;
* we can detect double touch as jumps, and that's all&lt;br /&gt;
* no pressure&lt;br /&gt;
* This could be an interesting input method for games - e.g. holding the Neo in landscape view, letting each thumb rest on a specific input area; probably needs to be checked for usability with a real device&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when sliding two fingers in parallel up(L,R)-&amp;gt;down(L,R)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see a slide along the center line between your two fingers. In practice, you can't keep the pressure equal, so you will see some kind of zig-zag line somewhere between the two pressure points in the direction of your slide.&lt;br /&gt;
&lt;br /&gt;
Question:&lt;br /&gt;
&lt;br /&gt;
  What does one see when narrowing two fingers in slide (=zoom effect on iphone)?&lt;br /&gt;
&lt;br /&gt;
Answer:&lt;br /&gt;
&lt;br /&gt;
* In theory you see the pointer stay at the center of the zoom movement. In practice, you can't keep the pressure equal for both fingers, so the pointer will move towards one of the two pressure points.&lt;br /&gt;
&lt;br /&gt;
====Graphics and computational capabilities====&lt;br /&gt;
&lt;br /&gt;
It would be good to report what performance the current hardware allows:&lt;br /&gt;
* There was no pure X11 benchmarking done (AFAIK) (how many fps at full VGA scrolling, ex: 1024*480 image scrolling?)&lt;br /&gt;
* what about the lcd reactivity? What if we don't see anything but blur while moving items fast?&lt;br /&gt;
&lt;br /&gt;
Please report here your impressions.&lt;br /&gt;
&lt;br /&gt;
==Areas of improvement==&lt;br /&gt;
&lt;br /&gt;
* OpenGL for fluid zooming interfaces (2D: the infinite sphere model, 1D: the infinite wheel of fortune/ribbon model, exposé)&lt;br /&gt;
* HandGestures&lt;br /&gt;
* Physics-model based improvements: inertia and friction&lt;br /&gt;
* multi touch screen for natural handgestures &lt;br /&gt;
* improved virtual keyboard&lt;br /&gt;
* switching to another GUI toolkit (EFLs)&lt;br /&gt;
&lt;br /&gt;
===Physics-inspired animation a.k.a. &amp;quot;Digital Physics&amp;quot;===&lt;br /&gt;
&lt;br /&gt;
If we want to add eye candy &amp;amp; usability to the UI (such as smooth realistic list scrolling, as seen in apple's&lt;br /&gt;
iphone demo on contacts lists for instance), we'll need a physics engine, so that moves &amp;amp; animations aren't all linear.&lt;br /&gt;
&lt;br /&gt;
The following aticle explains the [http://www.readwriteweb.com/archives/the_physics_of_iphone.php Digital Physics] term from the iPhone example.&lt;br /&gt;
&lt;br /&gt;
The most used technique for calculating trajectories and systems of related geometrical objects seems to be [http://en.wikipedia.org/wiki/Verlet_integration verlet integration] implementation; it is an alternative to Euler's integration method, using fast approximation. &lt;br /&gt;
&lt;br /&gt;
We may have no need for such a mathematical method at first, but perhaps there are other use cases. For instance, it may be useful to gesture recognition (i'm not aware if existing gesture recognition engines measure speed, acceleration...).&lt;br /&gt;
&lt;br /&gt;
====Open Dynamics Engine====&lt;br /&gt;
&lt;br /&gt;
ODE is an open source, high performance library for simulating rigid body dynamics. It is fully featured, stable, mature and platform independent with an easy to use C/C++ API. It has advanced joint types and integrated collision detection with friction. ODE is useful for simulating vehicles, objects in virtual reality environments and virtual creatures. It is currently used in many computer games, 3D authoring tools and simulation tools.&lt;br /&gt;
&lt;br /&gt;
http://www.ode.org/&lt;br /&gt;
&lt;br /&gt;
====Libakamaru====&lt;br /&gt;
&lt;br /&gt;
The [http://people.freedesktop.org/~krh/akamaru.git/ akamaru library] is the code behind [http://www.youtube.com/watch?v=VekgyKQoTeM kiba dock]'s fun and dynamic behaviour. It's dependencies are light (needs just GLib). It takes elasticity, friction, gravity into account.&lt;br /&gt;
&lt;br /&gt;
If you want to take a quick look at the code:&lt;br /&gt;
svn co http://svn.kiba-dock.org/akamaru/ akamaru&lt;br /&gt;
&lt;br /&gt;
The only (AFAIK) application using this library is kiba-dock, a *fun* app launcher, but we may find another use to it in the future.&lt;br /&gt;
&lt;br /&gt;
As suggested on the mailing list, it is mostly overkill for the uses we intend to have, but this library may be optimized already, the API can spare some time for too. Furthermore, ''Qui peut le plus, peut le moins''.&lt;br /&gt;
&lt;br /&gt;
====Verlet integration implementation from e17====&lt;br /&gt;
&lt;br /&gt;
There's an undergoing verlet integration implementation into the e17 project (by rephorm) see http://rephorm.com/news/tag/physics , so we may see some UI physics integration into e17 someday.&lt;br /&gt;
&lt;br /&gt;
====Robert Pernner's easy equations====&lt;br /&gt;
&lt;br /&gt;
http://www.robertpenner.com/easing/&lt;br /&gt;
&lt;br /&gt;
See the demo: implements non linear behaviour (actionscript), but may give inspiration&lt;br /&gt;
&lt;br /&gt;
===Extending the touchscreen capabilities and input methods===&lt;br /&gt;
&lt;br /&gt;
* '''Multitouchscreen emulation'''&lt;br /&gt;
&lt;br /&gt;
If we got it right, when touching the screen on a second place, the cursor oscillates between the two points depending on relative pressure distribution. Using averaging algorithms, we may have the opportunity to detect peculiar behaviours.&lt;br /&gt;
&lt;br /&gt;
We need raw data (x,y,t) from the real hardware for the following behaviours:&lt;br /&gt;
* slide two fingers in parallel - vertical up/down (scroll)&lt;br /&gt;
* turn the two fingers around (rotate)&lt;br /&gt;
* slide two fingers towards each other (zoom-)&lt;br /&gt;
* slide two fingers apart (zoom+)&lt;br /&gt;
&lt;br /&gt;
When touching the screen with two fingers at the same time, we necessarily see the two points, or are able to extrapolate the position of the second one. This solution can add feature, but will probably be little erratic...&lt;br /&gt;
&lt;br /&gt;
* '''Touchscreen kernel module hacking'''&lt;br /&gt;
&lt;br /&gt;
We may correct the &amp;quot;half distance&amp;quot; phenomenon on double touch: if double touch is detected, then assimilate the cursor as twice further than the first touch. It would allow finer control, but higher instability.&lt;br /&gt;
&lt;br /&gt;
The double touch detection may be implemented in the driver itself, as well as stabilization.&lt;br /&gt;
&lt;br /&gt;
* '''Other detectable behaviours'''&lt;br /&gt;
&lt;br /&gt;
The warping can be used in the 4 diagonals, plus the up/down/right/left cross:&lt;br /&gt;
&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
  - 1            -  - 1          2 -  - 1            -  -      2       -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -              -  -              -  -              -  -              -&lt;br /&gt;
  -             2-  -              -  - 2            -  -      1       -&lt;br /&gt;
  ----------------  ----------------  ----------------  ----------------&lt;br /&gt;
&lt;br /&gt;
It's not double touch, but two sequential presses with a short time in between (~0.5 s)&lt;br /&gt;
&lt;br /&gt;
===Improved virtual keyboard===&lt;br /&gt;
&lt;br /&gt;
One nice idea for virtual input is [http://www.micropp.se/openmoko/ finger-splash]&lt;br /&gt;
&lt;br /&gt;
Yet, optimization does not only apply to the plain one-letter-at-a-time input. We need some sort of T9 (dictionary-based input help). When typing a word, the first letter determines the next possible ones. Therefore, we may let disappear the less-probable following letters. Ex: type an L, there's no way an X follows...&lt;br /&gt;
&lt;br /&gt;
Hints: &lt;br /&gt;
* ZIP's huffmann compression applied to SMSs/mails for detecting the most used characters/words/sentences.&lt;br /&gt;
* html tag-couds, one-letter tag clouds ; font size proportional to the probability of being used&lt;br /&gt;
&lt;br /&gt;
The most critical point is the initial disposition of the letters, before any letter is typed. We may also want to use horizontal two-parts keyboard (with the neo in hands like a psp..)&lt;br /&gt;
&lt;br /&gt;
The [http://www.strout.net/info/ideas/hexinput.html hexinput] concept is interesting. What about hiding the less probable letters and increasing the remaining ones during typing?&lt;br /&gt;
&lt;br /&gt;
===Choosing the right GUI toolkit===&lt;br /&gt;
&lt;br /&gt;
There are [http://www.hbmobile.org/wiki/index.php?title=GUI_Frameworks lots of possible GUI frameworks] with various software architectures that can be used for OpenMoko.&lt;br /&gt;
&lt;br /&gt;
GTA01 hardware uses GTK+/matchbox without hardware acceleration, and it's not enough: this is a first that a mobile linux device has such a high DPI resolution.&lt;br /&gt;
&lt;br /&gt;
Benchmarking will be needed to compare the different alternatives: qt, directfbgtk, ...&lt;br /&gt;
&lt;br /&gt;
====Switching to the Enlightenment Foundation Libraries====&lt;br /&gt;
&lt;br /&gt;
''Moved [[E17|here]]''&lt;br /&gt;
&lt;br /&gt;
====Distant future: OpenGL compositing====&lt;br /&gt;
&lt;br /&gt;
Compositing seems to give zooming interfaces reality (at last!).&lt;br /&gt;
&lt;br /&gt;
Well, considering recent changes in destkop applications, opengl has a definite future. For instance, the expose (be it apple's or beryl's) is a very interesting and usable feature. Using compositing allows the physics metaphore: '''the human brain doesn't like &amp;quot;gaps&amp;quot;/jumps (for instance while scrolling a text), it needs continuity''', which can be provided by opengl. When you look at apple's iphone prototype, it's not just eye candy, it's maybe the most natural/human way of navigating, because it's sufficiently&lt;br /&gt;
realistic for the brain to forget the non-physical nature of what's inside.&lt;br /&gt;
&lt;br /&gt;
So, opengl hardware will be needed in a more or less distant hardware,&lt;br /&gt;
for 100% fluid operation.&lt;br /&gt;
&lt;br /&gt;
How cool will solid-based (polygons, as seen in beryl) interfaces be? :) Real ZUIs...&lt;br /&gt;
&lt;br /&gt;
====Clutter Toolkit====&lt;br /&gt;
&lt;br /&gt;
Clutter, an openedhand project, is an open source software library for creating fast, visually rich graphical user interfaces. The most obvious example of potential usage is in media center type applications. We hope however it can be used for a lot more.&lt;br /&gt;
&lt;br /&gt;
http://clutter-project.org/&lt;br /&gt;
&lt;br /&gt;
Clutter uses OpenGL (and optionally '''OpenGL ES''') for rendering but with an API which hides the underlying GL complexity from the developer. The Clutter API is intended to be easy to use, efficient and flexible.&lt;br /&gt;
&lt;br /&gt;
From the [http://en.wikipedia.org/wiki/OpenGL_ES wikipedia article], OpenGL ES (OpenGL for Embedded Systems) is a subset of the OpenGL 3D graphics API designed for embedded devices such as mobile phones, PDAs, and video game consoles.&lt;br /&gt;
&lt;br /&gt;
==Improvement ideas==&lt;br /&gt;
&lt;br /&gt;
Please add here any idea that seems of relevance.&lt;br /&gt;
&lt;br /&gt;
===1D list scrolling: looped physics-driven item list===&lt;br /&gt;
&lt;br /&gt;
====Description====&lt;br /&gt;
&lt;br /&gt;
Take an item list (ex: adress book), print it on a ribbon of paper, and glue it on a wheel (on the tire). You're looking in the front of it, so when you want to go from the A to Z, you touch the wheel and drag it up. When you let the wheel go, it goes furter, taken by it's inertia. Stop the wheel when you got your contact. Got the idea? That's why we may speak of an &amp;quot;infinite wheel&amp;quot;, so that the surface is flat. For our case here, we always want to display square content, so the [http://en.wikipedia.org/wiki/Uniform_prism n-sided uniform prism] analogy is mathematically more exact.&lt;br /&gt;
&lt;br /&gt;
Important features:&lt;br /&gt;
* '''weight''': the biggest the item list, the faster it scrolls; that way, you don't have to wait too long for big lists, and you don't miss your item on shorter lists&lt;br /&gt;
* '''friction''': there is friction where the wheel is fixed, so that the wheel doesn't turn infinitely; more friction on short lists, less on big ones&lt;br /&gt;
* the '''initial speed and acceleration vector''' you give it determines it's futher rotation&lt;br /&gt;
* it's &amp;quot;round&amp;quot;/cyclic, so you can '''browse the list in two directions'''&lt;br /&gt;
* we may want to add a &amp;quot;progression indicator&amp;quot;, ex the current alphabetical letter, with a font size adequate to the proportion of the number of entries in the letter subcategory, or a reduced map of the distribution of the first letters...&lt;br /&gt;
 &lt;br /&gt;
We can add &amp;quot;parallel wheels&amp;quot;, symbolizing different sorting methods. Slide long to the left / right to look at a different wheel = items organization.&lt;br /&gt;
&lt;br /&gt;
====Controls====&lt;br /&gt;
&lt;br /&gt;
* Sliding up/down = Single click + maintained for a minimal distance&lt;br /&gt;
&lt;br /&gt;
Effect: scroll in an inverted/negated fashion (slide down = scroll up, slide up = scroll down)&lt;br /&gt;
&lt;br /&gt;
When finger is released (i.e. touchscreen doesn't detect any press):&lt;br /&gt;
  if (last_speed_seen &amp;gt; 0 ) then keep this speed and acceleration, with friction&lt;br /&gt;
  else stop scrolling&lt;br /&gt;
&lt;br /&gt;
Scrolling here is seen as unidimensional, but can apply to bidimensional situations (ex: zoomed image) too&lt;br /&gt;
&lt;br /&gt;
* Action = quick double tap&lt;br /&gt;
&lt;br /&gt;
* Details/select = short single tap&lt;br /&gt;
&lt;br /&gt;
* Right click = long tap&lt;br /&gt;
&lt;br /&gt;
* Sliding left/right: switch sorting method&lt;br /&gt;
&lt;br /&gt;
====Parts to modify====&lt;br /&gt;
&lt;br /&gt;
''Having a scroll that isn't a 1:1 map to the user's action isn't hard. It's just an extra calculation in the scroll code.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;---- Where is the scroll code? :)&lt;br /&gt;
&lt;br /&gt;
* libmokoui&lt;br /&gt;
** [[Stylus_Scrolling | Stylus scrolling widget]]&lt;br /&gt;
** [[Finger_Scrolling | Finger scrolling wheel widget]]&lt;br /&gt;
* gtk&lt;br /&gt;
** [http://www.gtk.org/api/2.6/gtk/GtkVScrollbar.html GtkVScrollbar]&lt;br /&gt;
&lt;br /&gt;
The best would be to add the feature for both finger and stylus scrolling.&lt;br /&gt;
&lt;br /&gt;
TODO:&lt;br /&gt;
* make the entire list a &amp;quot;scrolling zone&amp;quot;, i.e. an overlay transparent scrolling widget?&lt;br /&gt;
* define controls&lt;br /&gt;
* add the inertia feature&lt;br /&gt;
&lt;br /&gt;
===1D Scrolling: inertia friction integration into openmoko's finger wheel=== &lt;br /&gt;
&lt;br /&gt;
The same, but for the wheel. It can be very short to do: you don't have 1:1 anymore, but, for example, 1/4 wheel turn = 1 item. It's demultiplicated, but has inertia.&lt;br /&gt;
&lt;br /&gt;
===Handgesture recognition proposals===&lt;br /&gt;
&lt;br /&gt;
====Using simple, localized warp as modifier key====&lt;br /&gt;
&lt;br /&gt;
As discussed on community list:&lt;br /&gt;
&lt;br /&gt;
  If you hold down one finger and tap the other one, the mouse pops over and back&lt;br /&gt;
  again. If you keep your second finger touching, the cursor follows it. When you&lt;br /&gt;
  release it, cursor goes back to first finger position. This could be a way to&lt;br /&gt;
  set a bounding box or turn on the mode. So the second finger can do something&lt;br /&gt;
  like rotating around the first, or increase or lower the distance to the first.&lt;br /&gt;
&lt;br /&gt;
* the socalled &amp;quot;first touch&amp;quot; can be done on the mokowheel zone itself: put your left thumb on the black area; if you touch the screen with another finger, there is a '''warp'''; the warp is detectable and allows to enter &amp;quot;fake multitouchscreen mode&amp;quot;&lt;br /&gt;
* afterwards,&lt;br /&gt;
     * slide your righthand finger down, it scrolls up&lt;br /&gt;
     * slide your righthand finger up, it scrolls down&lt;br /&gt;
     * slide it left, next page/item&lt;br /&gt;
     * slide it right, previous page/item&lt;br /&gt;
     * do a circle: rotation&lt;br /&gt;
     * narrow towards the black circle: zoom -&lt;br /&gt;
     * go away: zoom +&lt;br /&gt;
* if you had kept your first finger on the black quartercircle, you can continue issuing other gestures&lt;br /&gt;
&lt;br /&gt;
The advantages of using simple origin-driven cursor warping as double touch detection criteria is that:&lt;br /&gt;
* you don't have to use the wheel as button, which would slow things down and generate errors (false button presses)&lt;br /&gt;
* simpler detection algorithms that can pass by the fluctuation due to pressure relative distribution&lt;br /&gt;
* the space taken by the wheel itself is &amp;quot;useless&amp;quot; (i.e. displays no information); using it as modifier allows to keep the screen clean for reading&lt;br /&gt;
* the origin of this zone lets use maximum surface of the screen, allowing more fine controlling&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_rotate_right.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_previous.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_scroll_down.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Fake_multitouch_zoom-.png]]&lt;br /&gt;
&lt;br /&gt;
*Pros:&lt;br /&gt;
** who said we need multitouch hardware?&lt;br /&gt;
** this may be the easiest way (in terms of design/implementation complexity, reliability)&lt;br /&gt;
*Cons: &lt;br /&gt;
** no matter what we'll invent, we'll need two hands for on-the-move controlling&lt;br /&gt;
** what about left-handeds?&lt;br /&gt;
&lt;br /&gt;
====What is to modify ?====&lt;br /&gt;
&lt;br /&gt;
We need to emulate key presses. We need to work at a layer where we can get raw cursor coordinates. &amp;lt;---- X server layer?&lt;br /&gt;
&lt;br /&gt;
====Full multi-touch emulation====&lt;br /&gt;
&lt;br /&gt;
Doable, but tricky...&lt;br /&gt;
&lt;br /&gt;
==Open questions==&lt;br /&gt;
&lt;br /&gt;
* will the neo/openmoko graphics system be powerful enough for such uses? I apple uses an OpenGL ES acceleration on this device (as well as on recent iPods), which is on the way with GTA02&lt;br /&gt;
* how does the touchscreen behave? We need a detailed touchscreen wiki information page, with visual traces. How hardware-specific is it?&lt;br /&gt;
* is multi touch really that awesome? I guess not.&lt;br /&gt;
&lt;br /&gt;
[[Category:User Interfaces]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro</id>
		<title>Wishlist/LiveUSB distro</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro"/>
				<updated>2007-06-20T23:09:59Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* The BlackDog project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{wishlist}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
NOTE: this page may be renamed: portable destkop&lt;br /&gt;
&lt;br /&gt;
An openmoko device could act as '''the perfect geeky swiss knive''': go anywhere with your Linux desktop and tools.&lt;br /&gt;
&lt;br /&gt;
YES, there are tons of liveCDs out there, but CDs/DVDs:&lt;br /&gt;
* get easily damaged&lt;br /&gt;
* don't fit in a pocket (except for businesscard-sized ones ; too exotic...)&lt;br /&gt;
* don't update or save settings/personal data without a supplementary USB device&lt;br /&gt;
&lt;br /&gt;
YES, there are LiveUSB distros but:&lt;br /&gt;
* a Neo/OpenMoko device IS sort of an USB stick; one object is better than two&lt;br /&gt;
* i carry my cellphone everywhere, not my USB stick&lt;br /&gt;
* there is almost no security on USB sticks (nothing like cryptoloop devices, right?)&lt;br /&gt;
&lt;br /&gt;
The biggest argument against these ones is that you'd have to carry an USB cable with you... But it's a standard one, which is good news :)&lt;br /&gt;
&lt;br /&gt;
Similar functionality can be found in [http://en.wikipedia.org/wiki/Wizpy the Wizpy portable media player]&lt;br /&gt;
&lt;br /&gt;
When the openmoko device is in mass storage mode, a host computer should be able to boot on it, presenting a grub menu offering to boot into several images / partitions (payloads) on the transflash: memtest, UBCD (the ultimate boot cd), a lightweight security oriented livecd distro, you name it... &lt;br /&gt;
&lt;br /&gt;
It's sometimes called Live USB: from [http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB definition], ''A live USB is a USB flash drive containing a full operating system which can be booted from. Live USBs are closely related to Live CDs, and are sometimes used interchangeably. Like Live CDs, Live USBs can be used for system administration, data recovery, or the testing of operating system distributions without committing to a permanent installation on the local hard drive. Many of the smaller Linux distributions can also be used from a USB flash drive.''&lt;br /&gt;
&lt;br /&gt;
Usually, all you need for this with an USB storage device (flash USB stick or external drive) is a partition, flagged &amp;quot;bootable&amp;quot; (see fdisk), containing a boot loader (say grub). But the problem is that specifications vary between motherboards, so there are variants and mandatory requirements to define (here would be a good idea), so that one can optimize/maximize the compatibility.&lt;br /&gt;
&lt;br /&gt;
==The perfect geek knife==&lt;br /&gt;
&lt;br /&gt;
We may want to start our own distro with the following constraints:&lt;br /&gt;
* Multiboot: small utilities/compilations + bull blown light OS&lt;br /&gt;
* Aiming at maximum hardware compatibility, possibly using liveCD technology (knoppix-based distros)&lt;br /&gt;
* Aiming at minimum resource+system footprint, and boot speed&lt;br /&gt;
* Being able to install software temporary (for the session) or permanently, upgradable&lt;br /&gt;
* Being able to use the phone features at the same time (access pim, data &amp;amp; calls)&lt;br /&gt;
&lt;br /&gt;
Optimally, being able to charge the device while plugged in would be great too.&lt;br /&gt;
&lt;br /&gt;
==About USB Booting==&lt;br /&gt;
&lt;br /&gt;
From [http://www.damnsmalllinux.org/wiki/index.php/USB_Booting DSL Wiki]:&lt;br /&gt;
&lt;br /&gt;
Older computer BIOS usually do not support direct booting from a USB device. Around 2001, PC motherboard manufacturers started to add USB boot support.&lt;br /&gt;
&lt;br /&gt;
There are two common BIOS methods for direct USB booting:&lt;br /&gt;
* One method is called the &amp;quot;USBHDD&amp;quot; method and it is used to support the booting of standard USB mass storage devices that are configured like a normal PC hard drive.&lt;br /&gt;
* The other method is called the &amp;quot;USBZIP&amp;quot; method and it supports booting from a USB storage device that behaves like the original IOMEGA ZIP drive with USB support. &lt;br /&gt;
&lt;br /&gt;
Most computers (just about all Dells, for example) made today have a BIOS that supports the USBHDD method so I expect that this will eventually become the standard way to boot a USB device. However, many motherboards will support BOTH methods, and many older motherboards have USBZIP support.&lt;br /&gt;
&lt;br /&gt;
Some newer BIOSs which support USB 2.0 will not boot from an older pen drive. Using a USB 2.0 compliant one usually solves this problem. Also, some older BIOSs which only support USB 1.1 will not boot from newer drives which support USB 2.0!&lt;br /&gt;
&lt;br /&gt;
Some USB keys don't boot. If this is the case, it may be possible to fix them by installing a new master boot record. (Most keys boot OK by default; some cannot be fixed even by doing this. However, it helps in some cases). Run the command:&lt;br /&gt;
&lt;br /&gt;
  lilo -M /dev/sda&lt;br /&gt;
&lt;br /&gt;
==USB Booting in Neo1973's kernel==&lt;br /&gt;
&lt;br /&gt;
Although there is very little information about it, the g_storage kernel module is responsible for the Neo's mass storage mode. So the boot-or-not criteria might rely on this very module.&lt;br /&gt;
&lt;br /&gt;
==TODO==&lt;br /&gt;
&lt;br /&gt;
Testing/further research has to be conducted to determine:&lt;br /&gt;
* if a bootable-flagged partition / grub doesn't mess openmoko up&lt;br /&gt;
* if the phone can still act as a phone, or if the booted os can use the gprs functions&lt;br /&gt;
* if the phone can recharge on mass storage mode (from the usb cable)&lt;br /&gt;
* if a dedicated partition for each payload is needed (see memtest example...)&lt;br /&gt;
* if multi-boot is possible: grub?&lt;br /&gt;
&lt;br /&gt;
==Linux distro Howto's: liveUSB creation==&lt;br /&gt;
&lt;br /&gt;
In short:&lt;br /&gt;
#Mount USB drive, with e.g. mount /dev/sda1 /flash - can be either FAT16 or FAT32!&lt;br /&gt;
#Mount ISO image, with e.g. mount /tmp/dsl-3.2.iso /tmp/iso -o loop&lt;br /&gt;
#Copy all contents from ISO to USB drive: cp -vr /tmp/iso/* /flash/&lt;br /&gt;
#Rename and move syslinux files to root directory: mv /flash/boot/isolinux/* /flash/&lt;br /&gt;
#Rename isolinux.cfg: mv /flash/isolinux.cfg /flash/syslinux.cfg&lt;br /&gt;
#Unmount USB drive: umount /flash&lt;br /&gt;
#Install syslinux: syslinux /dev/sda1 and eventually set the MBR boot flag for this partition (with fdisk). &lt;br /&gt;
&lt;br /&gt;
*Fedora Core's [http://revisor.fedoraunity.org Revisor] enables easy GUI-driven ISO customization, allowing to choose the output medium (CD/DVD/USB)&lt;br /&gt;
*[http://www.damnsmalllinux.org/wiki/index.php/Installing_to_a_USB_Flash_Drive Installing DSL to USB device - using grub]&lt;br /&gt;
*[http://wiki.debian.org/BootUsb Debian BootUSB - using Lilo]&lt;br /&gt;
*[http://www.debuntu.org/how-to-install-ubuntu-linux-on-usb-bar Howto install ubuntu (or any other distro) on usb stick]&lt;br /&gt;
*[http://www.gentoo.org/doc/en/liveusb.xml Gentoo on usb stick]&lt;br /&gt;
*[http://pendrivelinux.com/ Windows &amp;amp; Linux tutorials &amp;amp; resources]:     &lt;br /&gt;
    * Flash installation via Windows: XUbuntu, DSL, Knoppix, Slax, MiniMe&lt;br /&gt;
    * Flash installation via Linux: Ubuntu Edgy, Knoppix, PCLinuxOS&lt;br /&gt;
&lt;br /&gt;
'''Transflash partitioning schema example'''&lt;br /&gt;
&lt;br /&gt;
* 2 Gb: /dev/sd? (where N is the transflash's number)&lt;br /&gt;
* 700 Mb: /dev/sd?1 : containing bootable iso, FAT16&lt;br /&gt;
* 1300 Mb: /dev/sd?2 : openmoko &amp;amp; bootable os home partition, EXT3?&lt;br /&gt;
* + eventually a swap&lt;br /&gt;
&lt;br /&gt;
The limitation of this method is that the booted OS is static (not-self modifiable). There's the option to install linux using the partition, but it's not really mobility-oriented (liveCDs are optimized for maximum autoconfiguration).&lt;br /&gt;
&lt;br /&gt;
==Alternative methods==&lt;br /&gt;
&lt;br /&gt;
===Booting ISOs ?===&lt;br /&gt;
&lt;br /&gt;
* Grub? From [http://www.freesoftwaremagazine.com/articles/grub_intro#comment-12900 How to install grub on an usb pendrive]:&lt;br /&gt;
    If you want to boot from a iso file on a harddisk, do something in menu.lst like&lt;br /&gt;
    title Boot from iso on a harddisk&lt;br /&gt;
    map (hdX,Y)/your.iso (hdZ)&lt;br /&gt;
    map --rehook&lt;br /&gt;
    chainloader (hdZ)+1&lt;br /&gt;
    rootnoverify (hdZ)&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
Grub &amp;amp; memdisk can boot floppy images, but (AFAIK) not isos. Example from the stock /boot/grub/menu.lst ubuntu:&lt;br /&gt;
    title           Ubuntu, memtest86+&lt;br /&gt;
    root            (hd0,2)&lt;br /&gt;
    kernel          /memtest86+.bin&lt;br /&gt;
    quiet&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
''Using the memdisk kernel from the syslinux package, you can load disk images and execute them in a non-emulated environment.''&lt;br /&gt;
&lt;br /&gt;
* [http://www.knoppix.net/wiki/Cheat_Codes knoppix '''bootfrom''' cheatcode]&lt;br /&gt;
&lt;br /&gt;
    bootfrom=/dev/hda1/KNX.iso &lt;br /&gt;
&lt;br /&gt;
Bootfrom needs access to a running Knoppix-System '''with the same Kernel as the Bootkernel''', before it is able to mount the partition / ISO-Image.  &lt;br /&gt;
&lt;br /&gt;
* Maybe there's a way to achieve a boot cd iso selecter see ([http://www.linuxquestions.org/questions/showthread.php?t=528840 this post])&lt;br /&gt;
* virtualization-oriented distro... ex [http://unit.aist.go.jp/itri/knoppix/xen/index-en.html Xenoppix] Cons: would work best only on modern VT-capable computers. What about a very minimal distribution (say DSL without X) kqemu-enblaed, booting into an ncurses iso-loader? The delicate part would be on the networking side.&lt;br /&gt;
&lt;br /&gt;
===Zero-Install / Networked systems===&lt;br /&gt;
&lt;br /&gt;
*[http://klik.atekon.de/wiki/index.php/Main_Page Klik] with more than 1000 packages ported. See [http://klik.atekon.de/wiki/index.php/Comparison comparison chart].&lt;br /&gt;
*[http://0install.net/index.html The Zero Install System], with automatic dependancies, upgrading. See [http://0install.net/matrix.html] comparison chart.&lt;br /&gt;
*Why not rolling a [http://wiki.rpath.com/wiki/Conary:Concepts Conary/RPath-based] distro, based on [http://www.rpath.com/rbuilder/project/rpath/ rPath linux] reference distribution ? Or choose within the available ones...&lt;br /&gt;
* The FUSE [http://httpfs.sourceforge.net/net_boot.htm httpfs] may allow pure http net booting, downloading files from a distant livecd only when needed (this image may be very minimal though).&lt;br /&gt;
* [http://developer.amazonwebservices.com/connect/thread.jspa?threadID=10271&amp;amp;start=75&amp;amp;tstart=0 some people] hare thinking of using Amazon S3 as virtual disk&lt;br /&gt;
&lt;br /&gt;
===Using Qemu to boot Linux from a flash drive within Windows===&lt;br /&gt;
&lt;br /&gt;
The following tutorial explains how to use Qemu to boot Linux from a portable USB flash device while still working within Windows. This Enables the user to have both systems running at the same time eliminating the need to restart the PC and set your BIOS options to boot Linux.&lt;br /&gt;
&lt;br /&gt;
[http://www.pendrivelinux.com/2007/03/09/use-qemu-to-boot-linux-from-windows/ PendriveLinux article]&lt;br /&gt;
&lt;br /&gt;
===Putting a vnc server on openmoko===&lt;br /&gt;
&lt;br /&gt;
That's another alternative :)&lt;br /&gt;
&lt;br /&gt;
===The BlackDog project===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;When plugged into the host computer’s USB port, BlackDog starts up, '''automatically launching the X Window system for Windows Xming and a software NAT router via an autorun application that the BlackDog presents to the host through a virtual USB CD-ROM. Once those applications are running, the virtual USB CD-ROM drive disconnects, and a virtual USB-to-Ethernet adapter is connected to provide the communications link.'''&lt;br /&gt;
&lt;br /&gt;
The host machine’s monitor, keyboard, mouse, and Internet connection are used by the BlackDog for the duration of the session.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The [http://en.wikipedia.org/wiki/BlackDog BlackDog server] project has lots of interesting concepts (and software). Could [http://www.jasonkolb.com/weblog/2006/11/idea_7_personal.html personal servers] change the face of computing ? Together with biometry, ''they open up the possibility of carrying your personal server, or an extension of it, with you on your physical person. The reason this is so exciting is because it enables biometric authentication that doesn't require shipping your biometric data to a third party'.&lt;br /&gt;
&lt;br /&gt;
==Interesting distros/payloads==&lt;br /&gt;
&lt;br /&gt;
'''System diagnostics / recovery'''&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Memtest Memtest86+] Very small&lt;br /&gt;
*[http://www.ultimatebootcd.com/ The Ultimate Boot CD]&lt;br /&gt;
*[http://www.sysresccd.org/Main_Page System Rescue CD]&lt;br /&gt;
*[http://www.tux.org/pub/people/kent-robotti/looplinux/rip/ Recovery IS Possible] &amp;lt; 80 MB&lt;br /&gt;
&lt;br /&gt;
'''General purpose'''&lt;br /&gt;
*[http://jinx-linux.sourceforge.net/ jinx-linux] &amp;lt; 50 MB&lt;br /&gt;
*[http://knoppix.com/ Knoppix] 700 MB CD-ROM&lt;br /&gt;
*[http://www.puppylinux.org PuppyLinux] &amp;lt; 100 MB&lt;br /&gt;
*[http://www.damnsmalllinux.org DSL] ~50 MB&lt;br /&gt;
*[http://gentoo-wiki.com/TinyGentoo#What_is_this_.3F TinyGentoo] 5 MB&lt;br /&gt;
&lt;br /&gt;
'''Security-oriented''': pentesting, forensics, anonymous webbrowsing&lt;br /&gt;
*[http://www.darknet.org.uk/2006/03/10-best-security-live-cd-distros-pen-test-forensics-recovery/ List of Security distros]&lt;br /&gt;
*[http://www.remote-exploit.org/backtrack.html Backtrack Livecd]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Anonym.OS Anonym.OS: browse the web anonymously]&lt;br /&gt;
*[http://dban.sourceforge.net/ Darik's Boot and Nuke]: ''dangerous''&lt;br /&gt;
*[http://byzgl.sourceforge.net/wiki/index.php/Main_Page Byzantine OS] is a webkiosk appliance (32/48 MB)&lt;br /&gt;
&lt;br /&gt;
The SabayonLinux distro offers a lot of [http://www.sabayonlinux.org/wiki/index.php?title=Sabayon_Linux#Boot_Methods_for_special_ways_of_using_Sabayon boot cheatcodes], such as booting onto GeexBox. We should take a look at the method used.&lt;br /&gt;
&lt;br /&gt;
'''[http://www.livecdlist.com/ List of live distros @ livecdlist.com]''' ''Includes sizes''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/List_of_LiveDistros List of live distros @ wikipedia]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://distrowatch.com/dwres.php?resource=cd List of live distros @ distrowatch]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB article]'''&lt;br /&gt;
&lt;br /&gt;
[[Category:Ideas]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro</id>
		<title>Wishlist/LiveUSB distro</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro"/>
				<updated>2007-06-20T23:08:58Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* The BlackDog project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{wishlist}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
NOTE: this page may be renamed: portable destkop&lt;br /&gt;
&lt;br /&gt;
An openmoko device could act as '''the perfect geeky swiss knive''': go anywhere with your Linux desktop and tools.&lt;br /&gt;
&lt;br /&gt;
YES, there are tons of liveCDs out there, but CDs/DVDs:&lt;br /&gt;
* get easily damaged&lt;br /&gt;
* don't fit in a pocket (except for businesscard-sized ones ; too exotic...)&lt;br /&gt;
* don't update or save settings/personal data without a supplementary USB device&lt;br /&gt;
&lt;br /&gt;
YES, there are LiveUSB distros but:&lt;br /&gt;
* a Neo/OpenMoko device IS sort of an USB stick; one object is better than two&lt;br /&gt;
* i carry my cellphone everywhere, not my USB stick&lt;br /&gt;
* there is almost no security on USB sticks (nothing like cryptoloop devices, right?)&lt;br /&gt;
&lt;br /&gt;
The biggest argument against these ones is that you'd have to carry an USB cable with you... But it's a standard one, which is good news :)&lt;br /&gt;
&lt;br /&gt;
Similar functionality can be found in [http://en.wikipedia.org/wiki/Wizpy the Wizpy portable media player]&lt;br /&gt;
&lt;br /&gt;
When the openmoko device is in mass storage mode, a host computer should be able to boot on it, presenting a grub menu offering to boot into several images / partitions (payloads) on the transflash: memtest, UBCD (the ultimate boot cd), a lightweight security oriented livecd distro, you name it... &lt;br /&gt;
&lt;br /&gt;
It's sometimes called Live USB: from [http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB definition], ''A live USB is a USB flash drive containing a full operating system which can be booted from. Live USBs are closely related to Live CDs, and are sometimes used interchangeably. Like Live CDs, Live USBs can be used for system administration, data recovery, or the testing of operating system distributions without committing to a permanent installation on the local hard drive. Many of the smaller Linux distributions can also be used from a USB flash drive.''&lt;br /&gt;
&lt;br /&gt;
Usually, all you need for this with an USB storage device (flash USB stick or external drive) is a partition, flagged &amp;quot;bootable&amp;quot; (see fdisk), containing a boot loader (say grub). But the problem is that specifications vary between motherboards, so there are variants and mandatory requirements to define (here would be a good idea), so that one can optimize/maximize the compatibility.&lt;br /&gt;
&lt;br /&gt;
==The perfect geek knife==&lt;br /&gt;
&lt;br /&gt;
We may want to start our own distro with the following constraints:&lt;br /&gt;
* Multiboot: small utilities/compilations + bull blown light OS&lt;br /&gt;
* Aiming at maximum hardware compatibility, possibly using liveCD technology (knoppix-based distros)&lt;br /&gt;
* Aiming at minimum resource+system footprint, and boot speed&lt;br /&gt;
* Being able to install software temporary (for the session) or permanently, upgradable&lt;br /&gt;
* Being able to use the phone features at the same time (access pim, data &amp;amp; calls)&lt;br /&gt;
&lt;br /&gt;
Optimally, being able to charge the device while plugged in would be great too.&lt;br /&gt;
&lt;br /&gt;
==About USB Booting==&lt;br /&gt;
&lt;br /&gt;
From [http://www.damnsmalllinux.org/wiki/index.php/USB_Booting DSL Wiki]:&lt;br /&gt;
&lt;br /&gt;
Older computer BIOS usually do not support direct booting from a USB device. Around 2001, PC motherboard manufacturers started to add USB boot support.&lt;br /&gt;
&lt;br /&gt;
There are two common BIOS methods for direct USB booting:&lt;br /&gt;
* One method is called the &amp;quot;USBHDD&amp;quot; method and it is used to support the booting of standard USB mass storage devices that are configured like a normal PC hard drive.&lt;br /&gt;
* The other method is called the &amp;quot;USBZIP&amp;quot; method and it supports booting from a USB storage device that behaves like the original IOMEGA ZIP drive with USB support. &lt;br /&gt;
&lt;br /&gt;
Most computers (just about all Dells, for example) made today have a BIOS that supports the USBHDD method so I expect that this will eventually become the standard way to boot a USB device. However, many motherboards will support BOTH methods, and many older motherboards have USBZIP support.&lt;br /&gt;
&lt;br /&gt;
Some newer BIOSs which support USB 2.0 will not boot from an older pen drive. Using a USB 2.0 compliant one usually solves this problem. Also, some older BIOSs which only support USB 1.1 will not boot from newer drives which support USB 2.0!&lt;br /&gt;
&lt;br /&gt;
Some USB keys don't boot. If this is the case, it may be possible to fix them by installing a new master boot record. (Most keys boot OK by default; some cannot be fixed even by doing this. However, it helps in some cases). Run the command:&lt;br /&gt;
&lt;br /&gt;
  lilo -M /dev/sda&lt;br /&gt;
&lt;br /&gt;
==USB Booting in Neo1973's kernel==&lt;br /&gt;
&lt;br /&gt;
Although there is very little information about it, the g_storage kernel module is responsible for the Neo's mass storage mode. So the boot-or-not criteria might rely on this very module.&lt;br /&gt;
&lt;br /&gt;
==TODO==&lt;br /&gt;
&lt;br /&gt;
Testing/further research has to be conducted to determine:&lt;br /&gt;
* if a bootable-flagged partition / grub doesn't mess openmoko up&lt;br /&gt;
* if the phone can still act as a phone, or if the booted os can use the gprs functions&lt;br /&gt;
* if the phone can recharge on mass storage mode (from the usb cable)&lt;br /&gt;
* if a dedicated partition for each payload is needed (see memtest example...)&lt;br /&gt;
* if multi-boot is possible: grub?&lt;br /&gt;
&lt;br /&gt;
==Linux distro Howto's: liveUSB creation==&lt;br /&gt;
&lt;br /&gt;
In short:&lt;br /&gt;
#Mount USB drive, with e.g. mount /dev/sda1 /flash - can be either FAT16 or FAT32!&lt;br /&gt;
#Mount ISO image, with e.g. mount /tmp/dsl-3.2.iso /tmp/iso -o loop&lt;br /&gt;
#Copy all contents from ISO to USB drive: cp -vr /tmp/iso/* /flash/&lt;br /&gt;
#Rename and move syslinux files to root directory: mv /flash/boot/isolinux/* /flash/&lt;br /&gt;
#Rename isolinux.cfg: mv /flash/isolinux.cfg /flash/syslinux.cfg&lt;br /&gt;
#Unmount USB drive: umount /flash&lt;br /&gt;
#Install syslinux: syslinux /dev/sda1 and eventually set the MBR boot flag for this partition (with fdisk). &lt;br /&gt;
&lt;br /&gt;
*Fedora Core's [http://revisor.fedoraunity.org Revisor] enables easy GUI-driven ISO customization, allowing to choose the output medium (CD/DVD/USB)&lt;br /&gt;
*[http://www.damnsmalllinux.org/wiki/index.php/Installing_to_a_USB_Flash_Drive Installing DSL to USB device - using grub]&lt;br /&gt;
*[http://wiki.debian.org/BootUsb Debian BootUSB - using Lilo]&lt;br /&gt;
*[http://www.debuntu.org/how-to-install-ubuntu-linux-on-usb-bar Howto install ubuntu (or any other distro) on usb stick]&lt;br /&gt;
*[http://www.gentoo.org/doc/en/liveusb.xml Gentoo on usb stick]&lt;br /&gt;
*[http://pendrivelinux.com/ Windows &amp;amp; Linux tutorials &amp;amp; resources]:     &lt;br /&gt;
    * Flash installation via Windows: XUbuntu, DSL, Knoppix, Slax, MiniMe&lt;br /&gt;
    * Flash installation via Linux: Ubuntu Edgy, Knoppix, PCLinuxOS&lt;br /&gt;
&lt;br /&gt;
'''Transflash partitioning schema example'''&lt;br /&gt;
&lt;br /&gt;
* 2 Gb: /dev/sd? (where N is the transflash's number)&lt;br /&gt;
* 700 Mb: /dev/sd?1 : containing bootable iso, FAT16&lt;br /&gt;
* 1300 Mb: /dev/sd?2 : openmoko &amp;amp; bootable os home partition, EXT3?&lt;br /&gt;
* + eventually a swap&lt;br /&gt;
&lt;br /&gt;
The limitation of this method is that the booted OS is static (not-self modifiable). There's the option to install linux using the partition, but it's not really mobility-oriented (liveCDs are optimized for maximum autoconfiguration).&lt;br /&gt;
&lt;br /&gt;
==Alternative methods==&lt;br /&gt;
&lt;br /&gt;
===Booting ISOs ?===&lt;br /&gt;
&lt;br /&gt;
* Grub? From [http://www.freesoftwaremagazine.com/articles/grub_intro#comment-12900 How to install grub on an usb pendrive]:&lt;br /&gt;
    If you want to boot from a iso file on a harddisk, do something in menu.lst like&lt;br /&gt;
    title Boot from iso on a harddisk&lt;br /&gt;
    map (hdX,Y)/your.iso (hdZ)&lt;br /&gt;
    map --rehook&lt;br /&gt;
    chainloader (hdZ)+1&lt;br /&gt;
    rootnoverify (hdZ)&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
Grub &amp;amp; memdisk can boot floppy images, but (AFAIK) not isos. Example from the stock /boot/grub/menu.lst ubuntu:&lt;br /&gt;
    title           Ubuntu, memtest86+&lt;br /&gt;
    root            (hd0,2)&lt;br /&gt;
    kernel          /memtest86+.bin&lt;br /&gt;
    quiet&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
''Using the memdisk kernel from the syslinux package, you can load disk images and execute them in a non-emulated environment.''&lt;br /&gt;
&lt;br /&gt;
* [http://www.knoppix.net/wiki/Cheat_Codes knoppix '''bootfrom''' cheatcode]&lt;br /&gt;
&lt;br /&gt;
    bootfrom=/dev/hda1/KNX.iso &lt;br /&gt;
&lt;br /&gt;
Bootfrom needs access to a running Knoppix-System '''with the same Kernel as the Bootkernel''', before it is able to mount the partition / ISO-Image.  &lt;br /&gt;
&lt;br /&gt;
* Maybe there's a way to achieve a boot cd iso selecter see ([http://www.linuxquestions.org/questions/showthread.php?t=528840 this post])&lt;br /&gt;
* virtualization-oriented distro... ex [http://unit.aist.go.jp/itri/knoppix/xen/index-en.html Xenoppix] Cons: would work best only on modern VT-capable computers. What about a very minimal distribution (say DSL without X) kqemu-enblaed, booting into an ncurses iso-loader? The delicate part would be on the networking side.&lt;br /&gt;
&lt;br /&gt;
===Zero-Install / Networked systems===&lt;br /&gt;
&lt;br /&gt;
*[http://klik.atekon.de/wiki/index.php/Main_Page Klik] with more than 1000 packages ported. See [http://klik.atekon.de/wiki/index.php/Comparison comparison chart].&lt;br /&gt;
*[http://0install.net/index.html The Zero Install System], with automatic dependancies, upgrading. See [http://0install.net/matrix.html] comparison chart.&lt;br /&gt;
*Why not rolling a [http://wiki.rpath.com/wiki/Conary:Concepts Conary/RPath-based] distro, based on [http://www.rpath.com/rbuilder/project/rpath/ rPath linux] reference distribution ? Or choose within the available ones...&lt;br /&gt;
* The FUSE [http://httpfs.sourceforge.net/net_boot.htm httpfs] may allow pure http net booting, downloading files from a distant livecd only when needed (this image may be very minimal though).&lt;br /&gt;
* [http://developer.amazonwebservices.com/connect/thread.jspa?threadID=10271&amp;amp;start=75&amp;amp;tstart=0 some people] hare thinking of using Amazon S3 as virtual disk&lt;br /&gt;
&lt;br /&gt;
===Using Qemu to boot Linux from a flash drive within Windows===&lt;br /&gt;
&lt;br /&gt;
The following tutorial explains how to use Qemu to boot Linux from a portable USB flash device while still working within Windows. This Enables the user to have both systems running at the same time eliminating the need to restart the PC and set your BIOS options to boot Linux.&lt;br /&gt;
&lt;br /&gt;
[http://www.pendrivelinux.com/2007/03/09/use-qemu-to-boot-linux-from-windows/ PendriveLinux article]&lt;br /&gt;
&lt;br /&gt;
===Putting a vnc server on openmoko===&lt;br /&gt;
&lt;br /&gt;
That's another alternative :)&lt;br /&gt;
&lt;br /&gt;
===The BlackDog project===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;When plugged into the host computer’s USB port, BlackDog starts up, '''automatically launching the X Window system for Windows Xming and a software NAT router via an autorun application that the BlackDog presents to the host through a virtual USB CD-ROM. Once those applications are running, the virtual USB CD-ROM drive disconnects, and a virtual USB-to-Ethernet adapter is connected to provide the communications link.'''&lt;br /&gt;
&lt;br /&gt;
The host machine’s monitor, keyboard, mouse, and Internet connection are used by the BlackDog for the duration of the session.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The [http://en.wikipedia.org/wiki/BlackDog BlackDog server] project has lots of interesting concepts (and software). Could [http://www.jasonkolb.com/weblog/2006/11/idea_7_personal.html Personal servers] change the face of computing ?&lt;br /&gt;
&lt;br /&gt;
==Interesting distros/payloads==&lt;br /&gt;
&lt;br /&gt;
'''System diagnostics / recovery'''&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Memtest Memtest86+] Very small&lt;br /&gt;
*[http://www.ultimatebootcd.com/ The Ultimate Boot CD]&lt;br /&gt;
*[http://www.sysresccd.org/Main_Page System Rescue CD]&lt;br /&gt;
*[http://www.tux.org/pub/people/kent-robotti/looplinux/rip/ Recovery IS Possible] &amp;lt; 80 MB&lt;br /&gt;
&lt;br /&gt;
'''General purpose'''&lt;br /&gt;
*[http://jinx-linux.sourceforge.net/ jinx-linux] &amp;lt; 50 MB&lt;br /&gt;
*[http://knoppix.com/ Knoppix] 700 MB CD-ROM&lt;br /&gt;
*[http://www.puppylinux.org PuppyLinux] &amp;lt; 100 MB&lt;br /&gt;
*[http://www.damnsmalllinux.org DSL] ~50 MB&lt;br /&gt;
*[http://gentoo-wiki.com/TinyGentoo#What_is_this_.3F TinyGentoo] 5 MB&lt;br /&gt;
&lt;br /&gt;
'''Security-oriented''': pentesting, forensics, anonymous webbrowsing&lt;br /&gt;
*[http://www.darknet.org.uk/2006/03/10-best-security-live-cd-distros-pen-test-forensics-recovery/ List of Security distros]&lt;br /&gt;
*[http://www.remote-exploit.org/backtrack.html Backtrack Livecd]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Anonym.OS Anonym.OS: browse the web anonymously]&lt;br /&gt;
*[http://dban.sourceforge.net/ Darik's Boot and Nuke]: ''dangerous''&lt;br /&gt;
*[http://byzgl.sourceforge.net/wiki/index.php/Main_Page Byzantine OS] is a webkiosk appliance (32/48 MB)&lt;br /&gt;
&lt;br /&gt;
The SabayonLinux distro offers a lot of [http://www.sabayonlinux.org/wiki/index.php?title=Sabayon_Linux#Boot_Methods_for_special_ways_of_using_Sabayon boot cheatcodes], such as booting onto GeexBox. We should take a look at the method used.&lt;br /&gt;
&lt;br /&gt;
'''[http://www.livecdlist.com/ List of live distros @ livecdlist.com]''' ''Includes sizes''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/List_of_LiveDistros List of live distros @ wikipedia]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://distrowatch.com/dwres.php?resource=cd List of live distros @ distrowatch]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB article]'''&lt;br /&gt;
&lt;br /&gt;
[[Category:Ideas]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro</id>
		<title>Wishlist/LiveUSB distro</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro"/>
				<updated>2007-06-20T22:52:42Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* The BlackDog project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{wishlist}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
NOTE: this page may be renamed: portable destkop&lt;br /&gt;
&lt;br /&gt;
An openmoko device could act as '''the perfect geeky swiss knive''': go anywhere with your Linux desktop and tools.&lt;br /&gt;
&lt;br /&gt;
YES, there are tons of liveCDs out there, but CDs/DVDs:&lt;br /&gt;
* get easily damaged&lt;br /&gt;
* don't fit in a pocket (except for businesscard-sized ones ; too exotic...)&lt;br /&gt;
* don't update or save settings/personal data without a supplementary USB device&lt;br /&gt;
&lt;br /&gt;
YES, there are LiveUSB distros but:&lt;br /&gt;
* a Neo/OpenMoko device IS sort of an USB stick; one object is better than two&lt;br /&gt;
* i carry my cellphone everywhere, not my USB stick&lt;br /&gt;
* there is almost no security on USB sticks (nothing like cryptoloop devices, right?)&lt;br /&gt;
&lt;br /&gt;
The biggest argument against these ones is that you'd have to carry an USB cable with you... But it's a standard one, which is good news :)&lt;br /&gt;
&lt;br /&gt;
Similar functionality can be found in [http://en.wikipedia.org/wiki/Wizpy the Wizpy portable media player]&lt;br /&gt;
&lt;br /&gt;
When the openmoko device is in mass storage mode, a host computer should be able to boot on it, presenting a grub menu offering to boot into several images / partitions (payloads) on the transflash: memtest, UBCD (the ultimate boot cd), a lightweight security oriented livecd distro, you name it... &lt;br /&gt;
&lt;br /&gt;
It's sometimes called Live USB: from [http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB definition], ''A live USB is a USB flash drive containing a full operating system which can be booted from. Live USBs are closely related to Live CDs, and are sometimes used interchangeably. Like Live CDs, Live USBs can be used for system administration, data recovery, or the testing of operating system distributions without committing to a permanent installation on the local hard drive. Many of the smaller Linux distributions can also be used from a USB flash drive.''&lt;br /&gt;
&lt;br /&gt;
Usually, all you need for this with an USB storage device (flash USB stick or external drive) is a partition, flagged &amp;quot;bootable&amp;quot; (see fdisk), containing a boot loader (say grub). But the problem is that specifications vary between motherboards, so there are variants and mandatory requirements to define (here would be a good idea), so that one can optimize/maximize the compatibility.&lt;br /&gt;
&lt;br /&gt;
==The perfect geek knife==&lt;br /&gt;
&lt;br /&gt;
We may want to start our own distro with the following constraints:&lt;br /&gt;
* Multiboot: small utilities/compilations + bull blown light OS&lt;br /&gt;
* Aiming at maximum hardware compatibility, possibly using liveCD technology (knoppix-based distros)&lt;br /&gt;
* Aiming at minimum resource+system footprint, and boot speed&lt;br /&gt;
* Being able to install software temporary (for the session) or permanently, upgradable&lt;br /&gt;
* Being able to use the phone features at the same time (access pim, data &amp;amp; calls)&lt;br /&gt;
&lt;br /&gt;
Optimally, being able to charge the device while plugged in would be great too.&lt;br /&gt;
&lt;br /&gt;
==About USB Booting==&lt;br /&gt;
&lt;br /&gt;
From [http://www.damnsmalllinux.org/wiki/index.php/USB_Booting DSL Wiki]:&lt;br /&gt;
&lt;br /&gt;
Older computer BIOS usually do not support direct booting from a USB device. Around 2001, PC motherboard manufacturers started to add USB boot support.&lt;br /&gt;
&lt;br /&gt;
There are two common BIOS methods for direct USB booting:&lt;br /&gt;
* One method is called the &amp;quot;USBHDD&amp;quot; method and it is used to support the booting of standard USB mass storage devices that are configured like a normal PC hard drive.&lt;br /&gt;
* The other method is called the &amp;quot;USBZIP&amp;quot; method and it supports booting from a USB storage device that behaves like the original IOMEGA ZIP drive with USB support. &lt;br /&gt;
&lt;br /&gt;
Most computers (just about all Dells, for example) made today have a BIOS that supports the USBHDD method so I expect that this will eventually become the standard way to boot a USB device. However, many motherboards will support BOTH methods, and many older motherboards have USBZIP support.&lt;br /&gt;
&lt;br /&gt;
Some newer BIOSs which support USB 2.0 will not boot from an older pen drive. Using a USB 2.0 compliant one usually solves this problem. Also, some older BIOSs which only support USB 1.1 will not boot from newer drives which support USB 2.0!&lt;br /&gt;
&lt;br /&gt;
Some USB keys don't boot. If this is the case, it may be possible to fix them by installing a new master boot record. (Most keys boot OK by default; some cannot be fixed even by doing this. However, it helps in some cases). Run the command:&lt;br /&gt;
&lt;br /&gt;
  lilo -M /dev/sda&lt;br /&gt;
&lt;br /&gt;
==USB Booting in Neo1973's kernel==&lt;br /&gt;
&lt;br /&gt;
Although there is very little information about it, the g_storage kernel module is responsible for the Neo's mass storage mode. So the boot-or-not criteria might rely on this very module.&lt;br /&gt;
&lt;br /&gt;
==TODO==&lt;br /&gt;
&lt;br /&gt;
Testing/further research has to be conducted to determine:&lt;br /&gt;
* if a bootable-flagged partition / grub doesn't mess openmoko up&lt;br /&gt;
* if the phone can still act as a phone, or if the booted os can use the gprs functions&lt;br /&gt;
* if the phone can recharge on mass storage mode (from the usb cable)&lt;br /&gt;
* if a dedicated partition for each payload is needed (see memtest example...)&lt;br /&gt;
* if multi-boot is possible: grub?&lt;br /&gt;
&lt;br /&gt;
==Linux distro Howto's: liveUSB creation==&lt;br /&gt;
&lt;br /&gt;
In short:&lt;br /&gt;
#Mount USB drive, with e.g. mount /dev/sda1 /flash - can be either FAT16 or FAT32!&lt;br /&gt;
#Mount ISO image, with e.g. mount /tmp/dsl-3.2.iso /tmp/iso -o loop&lt;br /&gt;
#Copy all contents from ISO to USB drive: cp -vr /tmp/iso/* /flash/&lt;br /&gt;
#Rename and move syslinux files to root directory: mv /flash/boot/isolinux/* /flash/&lt;br /&gt;
#Rename isolinux.cfg: mv /flash/isolinux.cfg /flash/syslinux.cfg&lt;br /&gt;
#Unmount USB drive: umount /flash&lt;br /&gt;
#Install syslinux: syslinux /dev/sda1 and eventually set the MBR boot flag for this partition (with fdisk). &lt;br /&gt;
&lt;br /&gt;
*Fedora Core's [http://revisor.fedoraunity.org Revisor] enables easy GUI-driven ISO customization, allowing to choose the output medium (CD/DVD/USB)&lt;br /&gt;
*[http://www.damnsmalllinux.org/wiki/index.php/Installing_to_a_USB_Flash_Drive Installing DSL to USB device - using grub]&lt;br /&gt;
*[http://wiki.debian.org/BootUsb Debian BootUSB - using Lilo]&lt;br /&gt;
*[http://www.debuntu.org/how-to-install-ubuntu-linux-on-usb-bar Howto install ubuntu (or any other distro) on usb stick]&lt;br /&gt;
*[http://www.gentoo.org/doc/en/liveusb.xml Gentoo on usb stick]&lt;br /&gt;
*[http://pendrivelinux.com/ Windows &amp;amp; Linux tutorials &amp;amp; resources]:     &lt;br /&gt;
    * Flash installation via Windows: XUbuntu, DSL, Knoppix, Slax, MiniMe&lt;br /&gt;
    * Flash installation via Linux: Ubuntu Edgy, Knoppix, PCLinuxOS&lt;br /&gt;
&lt;br /&gt;
'''Transflash partitioning schema example'''&lt;br /&gt;
&lt;br /&gt;
* 2 Gb: /dev/sd? (where N is the transflash's number)&lt;br /&gt;
* 700 Mb: /dev/sd?1 : containing bootable iso, FAT16&lt;br /&gt;
* 1300 Mb: /dev/sd?2 : openmoko &amp;amp; bootable os home partition, EXT3?&lt;br /&gt;
* + eventually a swap&lt;br /&gt;
&lt;br /&gt;
The limitation of this method is that the booted OS is static (not-self modifiable). There's the option to install linux using the partition, but it's not really mobility-oriented (liveCDs are optimized for maximum autoconfiguration).&lt;br /&gt;
&lt;br /&gt;
==Alternative methods==&lt;br /&gt;
&lt;br /&gt;
===Booting ISOs ?===&lt;br /&gt;
&lt;br /&gt;
* Grub? From [http://www.freesoftwaremagazine.com/articles/grub_intro#comment-12900 How to install grub on an usb pendrive]:&lt;br /&gt;
    If you want to boot from a iso file on a harddisk, do something in menu.lst like&lt;br /&gt;
    title Boot from iso on a harddisk&lt;br /&gt;
    map (hdX,Y)/your.iso (hdZ)&lt;br /&gt;
    map --rehook&lt;br /&gt;
    chainloader (hdZ)+1&lt;br /&gt;
    rootnoverify (hdZ)&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
Grub &amp;amp; memdisk can boot floppy images, but (AFAIK) not isos. Example from the stock /boot/grub/menu.lst ubuntu:&lt;br /&gt;
    title           Ubuntu, memtest86+&lt;br /&gt;
    root            (hd0,2)&lt;br /&gt;
    kernel          /memtest86+.bin&lt;br /&gt;
    quiet&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
''Using the memdisk kernel from the syslinux package, you can load disk images and execute them in a non-emulated environment.''&lt;br /&gt;
&lt;br /&gt;
* [http://www.knoppix.net/wiki/Cheat_Codes knoppix '''bootfrom''' cheatcode]&lt;br /&gt;
&lt;br /&gt;
    bootfrom=/dev/hda1/KNX.iso &lt;br /&gt;
&lt;br /&gt;
Bootfrom needs access to a running Knoppix-System '''with the same Kernel as the Bootkernel''', before it is able to mount the partition / ISO-Image.  &lt;br /&gt;
&lt;br /&gt;
* Maybe there's a way to achieve a boot cd iso selecter see ([http://www.linuxquestions.org/questions/showthread.php?t=528840 this post])&lt;br /&gt;
* virtualization-oriented distro... ex [http://unit.aist.go.jp/itri/knoppix/xen/index-en.html Xenoppix] Cons: would work best only on modern VT-capable computers. What about a very minimal distribution (say DSL without X) kqemu-enblaed, booting into an ncurses iso-loader? The delicate part would be on the networking side.&lt;br /&gt;
&lt;br /&gt;
===Zero-Install / Networked systems===&lt;br /&gt;
&lt;br /&gt;
*[http://klik.atekon.de/wiki/index.php/Main_Page Klik] with more than 1000 packages ported. See [http://klik.atekon.de/wiki/index.php/Comparison comparison chart].&lt;br /&gt;
*[http://0install.net/index.html The Zero Install System], with automatic dependancies, upgrading. See [http://0install.net/matrix.html] comparison chart.&lt;br /&gt;
*Why not rolling a [http://wiki.rpath.com/wiki/Conary:Concepts Conary/RPath-based] distro, based on [http://www.rpath.com/rbuilder/project/rpath/ rPath linux] reference distribution ? Or choose within the available ones...&lt;br /&gt;
* The FUSE [http://httpfs.sourceforge.net/net_boot.htm httpfs] may allow pure http net booting, downloading files from a distant livecd only when needed (this image may be very minimal though).&lt;br /&gt;
* [http://developer.amazonwebservices.com/connect/thread.jspa?threadID=10271&amp;amp;start=75&amp;amp;tstart=0 some people] hare thinking of using Amazon S3 as virtual disk&lt;br /&gt;
&lt;br /&gt;
===Using Qemu to boot Linux from a flash drive within Windows===&lt;br /&gt;
&lt;br /&gt;
The following tutorial explains how to use Qemu to boot Linux from a portable USB flash device while still working within Windows. This Enables the user to have both systems running at the same time eliminating the need to restart the PC and set your BIOS options to boot Linux.&lt;br /&gt;
&lt;br /&gt;
[http://www.pendrivelinux.com/2007/03/09/use-qemu-to-boot-linux-from-windows/ PendriveLinux article]&lt;br /&gt;
&lt;br /&gt;
===Putting a vnc server on openmoko===&lt;br /&gt;
&lt;br /&gt;
That's another alternative :)&lt;br /&gt;
&lt;br /&gt;
===The BlackDog project===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;When plugged into the host computer’s USB port, BlackDog starts up, '''automatically launching the X Window system for Windows Xming and a software NAT router via an autorun application that the BlackDog presents to the host through a virtual USB CD-ROM. Once those applications are running, the virtual USB CD-ROM drive disconnects, and a virtual USB-to-Ethernet adapter is connected to provide the communications link.'''&lt;br /&gt;
&lt;br /&gt;
The host machine’s monitor, keyboard, mouse, and Internet connection are used by the BlackDog for the duration of the session.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The [http://en.wikipedia.org/wiki/BlackDog BlackDog server] project has lots of interesting concepts (and software).&lt;br /&gt;
&lt;br /&gt;
==Interesting distros/payloads==&lt;br /&gt;
&lt;br /&gt;
'''System diagnostics / recovery'''&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Memtest Memtest86+] Very small&lt;br /&gt;
*[http://www.ultimatebootcd.com/ The Ultimate Boot CD]&lt;br /&gt;
*[http://www.sysresccd.org/Main_Page System Rescue CD]&lt;br /&gt;
*[http://www.tux.org/pub/people/kent-robotti/looplinux/rip/ Recovery IS Possible] &amp;lt; 80 MB&lt;br /&gt;
&lt;br /&gt;
'''General purpose'''&lt;br /&gt;
*[http://jinx-linux.sourceforge.net/ jinx-linux] &amp;lt; 50 MB&lt;br /&gt;
*[http://knoppix.com/ Knoppix] 700 MB CD-ROM&lt;br /&gt;
*[http://www.puppylinux.org PuppyLinux] &amp;lt; 100 MB&lt;br /&gt;
*[http://www.damnsmalllinux.org DSL] ~50 MB&lt;br /&gt;
*[http://gentoo-wiki.com/TinyGentoo#What_is_this_.3F TinyGentoo] 5 MB&lt;br /&gt;
&lt;br /&gt;
'''Security-oriented''': pentesting, forensics, anonymous webbrowsing&lt;br /&gt;
*[http://www.darknet.org.uk/2006/03/10-best-security-live-cd-distros-pen-test-forensics-recovery/ List of Security distros]&lt;br /&gt;
*[http://www.remote-exploit.org/backtrack.html Backtrack Livecd]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Anonym.OS Anonym.OS: browse the web anonymously]&lt;br /&gt;
*[http://dban.sourceforge.net/ Darik's Boot and Nuke]: ''dangerous''&lt;br /&gt;
*[http://byzgl.sourceforge.net/wiki/index.php/Main_Page Byzantine OS] is a webkiosk appliance (32/48 MB)&lt;br /&gt;
&lt;br /&gt;
The SabayonLinux distro offers a lot of [http://www.sabayonlinux.org/wiki/index.php?title=Sabayon_Linux#Boot_Methods_for_special_ways_of_using_Sabayon boot cheatcodes], such as booting onto GeexBox. We should take a look at the method used.&lt;br /&gt;
&lt;br /&gt;
'''[http://www.livecdlist.com/ List of live distros @ livecdlist.com]''' ''Includes sizes''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/List_of_LiveDistros List of live distros @ wikipedia]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://distrowatch.com/dwres.php?resource=cd List of live distros @ distrowatch]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB article]'''&lt;br /&gt;
&lt;br /&gt;
[[Category:Ideas]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro</id>
		<title>Wishlist/LiveUSB distro</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro"/>
				<updated>2007-06-20T22:51:40Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Putting a vnc server on openmoko */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{wishlist}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
NOTE: this page may be renamed: portable destkop&lt;br /&gt;
&lt;br /&gt;
An openmoko device could act as '''the perfect geeky swiss knive''': go anywhere with your Linux desktop and tools.&lt;br /&gt;
&lt;br /&gt;
YES, there are tons of liveCDs out there, but CDs/DVDs:&lt;br /&gt;
* get easily damaged&lt;br /&gt;
* don't fit in a pocket (except for businesscard-sized ones ; too exotic...)&lt;br /&gt;
* don't update or save settings/personal data without a supplementary USB device&lt;br /&gt;
&lt;br /&gt;
YES, there are LiveUSB distros but:&lt;br /&gt;
* a Neo/OpenMoko device IS sort of an USB stick; one object is better than two&lt;br /&gt;
* i carry my cellphone everywhere, not my USB stick&lt;br /&gt;
* there is almost no security on USB sticks (nothing like cryptoloop devices, right?)&lt;br /&gt;
&lt;br /&gt;
The biggest argument against these ones is that you'd have to carry an USB cable with you... But it's a standard one, which is good news :)&lt;br /&gt;
&lt;br /&gt;
Similar functionality can be found in [http://en.wikipedia.org/wiki/Wizpy the Wizpy portable media player]&lt;br /&gt;
&lt;br /&gt;
When the openmoko device is in mass storage mode, a host computer should be able to boot on it, presenting a grub menu offering to boot into several images / partitions (payloads) on the transflash: memtest, UBCD (the ultimate boot cd), a lightweight security oriented livecd distro, you name it... &lt;br /&gt;
&lt;br /&gt;
It's sometimes called Live USB: from [http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB definition], ''A live USB is a USB flash drive containing a full operating system which can be booted from. Live USBs are closely related to Live CDs, and are sometimes used interchangeably. Like Live CDs, Live USBs can be used for system administration, data recovery, or the testing of operating system distributions without committing to a permanent installation on the local hard drive. Many of the smaller Linux distributions can also be used from a USB flash drive.''&lt;br /&gt;
&lt;br /&gt;
Usually, all you need for this with an USB storage device (flash USB stick or external drive) is a partition, flagged &amp;quot;bootable&amp;quot; (see fdisk), containing a boot loader (say grub). But the problem is that specifications vary between motherboards, so there are variants and mandatory requirements to define (here would be a good idea), so that one can optimize/maximize the compatibility.&lt;br /&gt;
&lt;br /&gt;
==The perfect geek knife==&lt;br /&gt;
&lt;br /&gt;
We may want to start our own distro with the following constraints:&lt;br /&gt;
* Multiboot: small utilities/compilations + bull blown light OS&lt;br /&gt;
* Aiming at maximum hardware compatibility, possibly using liveCD technology (knoppix-based distros)&lt;br /&gt;
* Aiming at minimum resource+system footprint, and boot speed&lt;br /&gt;
* Being able to install software temporary (for the session) or permanently, upgradable&lt;br /&gt;
* Being able to use the phone features at the same time (access pim, data &amp;amp; calls)&lt;br /&gt;
&lt;br /&gt;
Optimally, being able to charge the device while plugged in would be great too.&lt;br /&gt;
&lt;br /&gt;
==About USB Booting==&lt;br /&gt;
&lt;br /&gt;
From [http://www.damnsmalllinux.org/wiki/index.php/USB_Booting DSL Wiki]:&lt;br /&gt;
&lt;br /&gt;
Older computer BIOS usually do not support direct booting from a USB device. Around 2001, PC motherboard manufacturers started to add USB boot support.&lt;br /&gt;
&lt;br /&gt;
There are two common BIOS methods for direct USB booting:&lt;br /&gt;
* One method is called the &amp;quot;USBHDD&amp;quot; method and it is used to support the booting of standard USB mass storage devices that are configured like a normal PC hard drive.&lt;br /&gt;
* The other method is called the &amp;quot;USBZIP&amp;quot; method and it supports booting from a USB storage device that behaves like the original IOMEGA ZIP drive with USB support. &lt;br /&gt;
&lt;br /&gt;
Most computers (just about all Dells, for example) made today have a BIOS that supports the USBHDD method so I expect that this will eventually become the standard way to boot a USB device. However, many motherboards will support BOTH methods, and many older motherboards have USBZIP support.&lt;br /&gt;
&lt;br /&gt;
Some newer BIOSs which support USB 2.0 will not boot from an older pen drive. Using a USB 2.0 compliant one usually solves this problem. Also, some older BIOSs which only support USB 1.1 will not boot from newer drives which support USB 2.0!&lt;br /&gt;
&lt;br /&gt;
Some USB keys don't boot. If this is the case, it may be possible to fix them by installing a new master boot record. (Most keys boot OK by default; some cannot be fixed even by doing this. However, it helps in some cases). Run the command:&lt;br /&gt;
&lt;br /&gt;
  lilo -M /dev/sda&lt;br /&gt;
&lt;br /&gt;
==USB Booting in Neo1973's kernel==&lt;br /&gt;
&lt;br /&gt;
Although there is very little information about it, the g_storage kernel module is responsible for the Neo's mass storage mode. So the boot-or-not criteria might rely on this very module.&lt;br /&gt;
&lt;br /&gt;
==TODO==&lt;br /&gt;
&lt;br /&gt;
Testing/further research has to be conducted to determine:&lt;br /&gt;
* if a bootable-flagged partition / grub doesn't mess openmoko up&lt;br /&gt;
* if the phone can still act as a phone, or if the booted os can use the gprs functions&lt;br /&gt;
* if the phone can recharge on mass storage mode (from the usb cable)&lt;br /&gt;
* if a dedicated partition for each payload is needed (see memtest example...)&lt;br /&gt;
* if multi-boot is possible: grub?&lt;br /&gt;
&lt;br /&gt;
==Linux distro Howto's: liveUSB creation==&lt;br /&gt;
&lt;br /&gt;
In short:&lt;br /&gt;
#Mount USB drive, with e.g. mount /dev/sda1 /flash - can be either FAT16 or FAT32!&lt;br /&gt;
#Mount ISO image, with e.g. mount /tmp/dsl-3.2.iso /tmp/iso -o loop&lt;br /&gt;
#Copy all contents from ISO to USB drive: cp -vr /tmp/iso/* /flash/&lt;br /&gt;
#Rename and move syslinux files to root directory: mv /flash/boot/isolinux/* /flash/&lt;br /&gt;
#Rename isolinux.cfg: mv /flash/isolinux.cfg /flash/syslinux.cfg&lt;br /&gt;
#Unmount USB drive: umount /flash&lt;br /&gt;
#Install syslinux: syslinux /dev/sda1 and eventually set the MBR boot flag for this partition (with fdisk). &lt;br /&gt;
&lt;br /&gt;
*Fedora Core's [http://revisor.fedoraunity.org Revisor] enables easy GUI-driven ISO customization, allowing to choose the output medium (CD/DVD/USB)&lt;br /&gt;
*[http://www.damnsmalllinux.org/wiki/index.php/Installing_to_a_USB_Flash_Drive Installing DSL to USB device - using grub]&lt;br /&gt;
*[http://wiki.debian.org/BootUsb Debian BootUSB - using Lilo]&lt;br /&gt;
*[http://www.debuntu.org/how-to-install-ubuntu-linux-on-usb-bar Howto install ubuntu (or any other distro) on usb stick]&lt;br /&gt;
*[http://www.gentoo.org/doc/en/liveusb.xml Gentoo on usb stick]&lt;br /&gt;
*[http://pendrivelinux.com/ Windows &amp;amp; Linux tutorials &amp;amp; resources]:     &lt;br /&gt;
    * Flash installation via Windows: XUbuntu, DSL, Knoppix, Slax, MiniMe&lt;br /&gt;
    * Flash installation via Linux: Ubuntu Edgy, Knoppix, PCLinuxOS&lt;br /&gt;
&lt;br /&gt;
'''Transflash partitioning schema example'''&lt;br /&gt;
&lt;br /&gt;
* 2 Gb: /dev/sd? (where N is the transflash's number)&lt;br /&gt;
* 700 Mb: /dev/sd?1 : containing bootable iso, FAT16&lt;br /&gt;
* 1300 Mb: /dev/sd?2 : openmoko &amp;amp; bootable os home partition, EXT3?&lt;br /&gt;
* + eventually a swap&lt;br /&gt;
&lt;br /&gt;
The limitation of this method is that the booted OS is static (not-self modifiable). There's the option to install linux using the partition, but it's not really mobility-oriented (liveCDs are optimized for maximum autoconfiguration).&lt;br /&gt;
&lt;br /&gt;
==Alternative methods==&lt;br /&gt;
&lt;br /&gt;
===Booting ISOs ?===&lt;br /&gt;
&lt;br /&gt;
* Grub? From [http://www.freesoftwaremagazine.com/articles/grub_intro#comment-12900 How to install grub on an usb pendrive]:&lt;br /&gt;
    If you want to boot from a iso file on a harddisk, do something in menu.lst like&lt;br /&gt;
    title Boot from iso on a harddisk&lt;br /&gt;
    map (hdX,Y)/your.iso (hdZ)&lt;br /&gt;
    map --rehook&lt;br /&gt;
    chainloader (hdZ)+1&lt;br /&gt;
    rootnoverify (hdZ)&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
Grub &amp;amp; memdisk can boot floppy images, but (AFAIK) not isos. Example from the stock /boot/grub/menu.lst ubuntu:&lt;br /&gt;
    title           Ubuntu, memtest86+&lt;br /&gt;
    root            (hd0,2)&lt;br /&gt;
    kernel          /memtest86+.bin&lt;br /&gt;
    quiet&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
''Using the memdisk kernel from the syslinux package, you can load disk images and execute them in a non-emulated environment.''&lt;br /&gt;
&lt;br /&gt;
* [http://www.knoppix.net/wiki/Cheat_Codes knoppix '''bootfrom''' cheatcode]&lt;br /&gt;
&lt;br /&gt;
    bootfrom=/dev/hda1/KNX.iso &lt;br /&gt;
&lt;br /&gt;
Bootfrom needs access to a running Knoppix-System '''with the same Kernel as the Bootkernel''', before it is able to mount the partition / ISO-Image.  &lt;br /&gt;
&lt;br /&gt;
* Maybe there's a way to achieve a boot cd iso selecter see ([http://www.linuxquestions.org/questions/showthread.php?t=528840 this post])&lt;br /&gt;
* virtualization-oriented distro... ex [http://unit.aist.go.jp/itri/knoppix/xen/index-en.html Xenoppix] Cons: would work best only on modern VT-capable computers. What about a very minimal distribution (say DSL without X) kqemu-enblaed, booting into an ncurses iso-loader? The delicate part would be on the networking side.&lt;br /&gt;
&lt;br /&gt;
===Zero-Install / Networked systems===&lt;br /&gt;
&lt;br /&gt;
*[http://klik.atekon.de/wiki/index.php/Main_Page Klik] with more than 1000 packages ported. See [http://klik.atekon.de/wiki/index.php/Comparison comparison chart].&lt;br /&gt;
*[http://0install.net/index.html The Zero Install System], with automatic dependancies, upgrading. See [http://0install.net/matrix.html] comparison chart.&lt;br /&gt;
*Why not rolling a [http://wiki.rpath.com/wiki/Conary:Concepts Conary/RPath-based] distro, based on [http://www.rpath.com/rbuilder/project/rpath/ rPath linux] reference distribution ? Or choose within the available ones...&lt;br /&gt;
* The FUSE [http://httpfs.sourceforge.net/net_boot.htm httpfs] may allow pure http net booting, downloading files from a distant livecd only when needed (this image may be very minimal though).&lt;br /&gt;
* [http://developer.amazonwebservices.com/connect/thread.jspa?threadID=10271&amp;amp;start=75&amp;amp;tstart=0 some people] hare thinking of using Amazon S3 as virtual disk&lt;br /&gt;
&lt;br /&gt;
===Using Qemu to boot Linux from a flash drive within Windows===&lt;br /&gt;
&lt;br /&gt;
The following tutorial explains how to use Qemu to boot Linux from a portable USB flash device while still working within Windows. This Enables the user to have both systems running at the same time eliminating the need to restart the PC and set your BIOS options to boot Linux.&lt;br /&gt;
&lt;br /&gt;
[http://www.pendrivelinux.com/2007/03/09/use-qemu-to-boot-linux-from-windows/ PendriveLinux article]&lt;br /&gt;
&lt;br /&gt;
===Putting a vnc server on openmoko===&lt;br /&gt;
&lt;br /&gt;
That's another alternative :)&lt;br /&gt;
&lt;br /&gt;
===The BlackDog project===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;When plugged into the host computer’s USB port, BlackDog starts up, automatically launching the X Window system for Windows Xming and a software NAT router via an autorun application that the BlackDog presents to the host through a virtual USB CD-ROM. Once those applications are running, the virtual USB CD-ROM drive disconnects, and a virtual USB-to-Ethernet adapter is connected to provide the communications link.&lt;br /&gt;
&lt;br /&gt;
The host machine’s monitor, keyboard, mouse, and Internet connection are used by the BlackDog for the duration of the session.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The [http://en.wikipedia.org/wiki/BlackDog BlackDog server] project has lots of interesting concepts (and software).&lt;br /&gt;
&lt;br /&gt;
==Interesting distros/payloads==&lt;br /&gt;
&lt;br /&gt;
'''System diagnostics / recovery'''&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Memtest Memtest86+] Very small&lt;br /&gt;
*[http://www.ultimatebootcd.com/ The Ultimate Boot CD]&lt;br /&gt;
*[http://www.sysresccd.org/Main_Page System Rescue CD]&lt;br /&gt;
*[http://www.tux.org/pub/people/kent-robotti/looplinux/rip/ Recovery IS Possible] &amp;lt; 80 MB&lt;br /&gt;
&lt;br /&gt;
'''General purpose'''&lt;br /&gt;
*[http://jinx-linux.sourceforge.net/ jinx-linux] &amp;lt; 50 MB&lt;br /&gt;
*[http://knoppix.com/ Knoppix] 700 MB CD-ROM&lt;br /&gt;
*[http://www.puppylinux.org PuppyLinux] &amp;lt; 100 MB&lt;br /&gt;
*[http://www.damnsmalllinux.org DSL] ~50 MB&lt;br /&gt;
*[http://gentoo-wiki.com/TinyGentoo#What_is_this_.3F TinyGentoo] 5 MB&lt;br /&gt;
&lt;br /&gt;
'''Security-oriented''': pentesting, forensics, anonymous webbrowsing&lt;br /&gt;
*[http://www.darknet.org.uk/2006/03/10-best-security-live-cd-distros-pen-test-forensics-recovery/ List of Security distros]&lt;br /&gt;
*[http://www.remote-exploit.org/backtrack.html Backtrack Livecd]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Anonym.OS Anonym.OS: browse the web anonymously]&lt;br /&gt;
*[http://dban.sourceforge.net/ Darik's Boot and Nuke]: ''dangerous''&lt;br /&gt;
*[http://byzgl.sourceforge.net/wiki/index.php/Main_Page Byzantine OS] is a webkiosk appliance (32/48 MB)&lt;br /&gt;
&lt;br /&gt;
The SabayonLinux distro offers a lot of [http://www.sabayonlinux.org/wiki/index.php?title=Sabayon_Linux#Boot_Methods_for_special_ways_of_using_Sabayon boot cheatcodes], such as booting onto GeexBox. We should take a look at the method used.&lt;br /&gt;
&lt;br /&gt;
'''[http://www.livecdlist.com/ List of live distros @ livecdlist.com]''' ''Includes sizes''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/List_of_LiveDistros List of live distros @ wikipedia]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://distrowatch.com/dwres.php?resource=cd List of live distros @ distrowatch]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB article]'''&lt;br /&gt;
&lt;br /&gt;
[[Category:Ideas]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro</id>
		<title>Wishlist/LiveUSB distro</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro"/>
				<updated>2007-06-20T22:51:23Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* The BlackDog project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{wishlist}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
NOTE: this page may be renamed: portable destkop&lt;br /&gt;
&lt;br /&gt;
An openmoko device could act as '''the perfect geeky swiss knive''': go anywhere with your Linux desktop and tools.&lt;br /&gt;
&lt;br /&gt;
YES, there are tons of liveCDs out there, but CDs/DVDs:&lt;br /&gt;
* get easily damaged&lt;br /&gt;
* don't fit in a pocket (except for businesscard-sized ones ; too exotic...)&lt;br /&gt;
* don't update or save settings/personal data without a supplementary USB device&lt;br /&gt;
&lt;br /&gt;
YES, there are LiveUSB distros but:&lt;br /&gt;
* a Neo/OpenMoko device IS sort of an USB stick; one object is better than two&lt;br /&gt;
* i carry my cellphone everywhere, not my USB stick&lt;br /&gt;
* there is almost no security on USB sticks (nothing like cryptoloop devices, right?)&lt;br /&gt;
&lt;br /&gt;
The biggest argument against these ones is that you'd have to carry an USB cable with you... But it's a standard one, which is good news :)&lt;br /&gt;
&lt;br /&gt;
Similar functionality can be found in [http://en.wikipedia.org/wiki/Wizpy the Wizpy portable media player]&lt;br /&gt;
&lt;br /&gt;
When the openmoko device is in mass storage mode, a host computer should be able to boot on it, presenting a grub menu offering to boot into several images / partitions (payloads) on the transflash: memtest, UBCD (the ultimate boot cd), a lightweight security oriented livecd distro, you name it... &lt;br /&gt;
&lt;br /&gt;
It's sometimes called Live USB: from [http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB definition], ''A live USB is a USB flash drive containing a full operating system which can be booted from. Live USBs are closely related to Live CDs, and are sometimes used interchangeably. Like Live CDs, Live USBs can be used for system administration, data recovery, or the testing of operating system distributions without committing to a permanent installation on the local hard drive. Many of the smaller Linux distributions can also be used from a USB flash drive.''&lt;br /&gt;
&lt;br /&gt;
Usually, all you need for this with an USB storage device (flash USB stick or external drive) is a partition, flagged &amp;quot;bootable&amp;quot; (see fdisk), containing a boot loader (say grub). But the problem is that specifications vary between motherboards, so there are variants and mandatory requirements to define (here would be a good idea), so that one can optimize/maximize the compatibility.&lt;br /&gt;
&lt;br /&gt;
==The perfect geek knife==&lt;br /&gt;
&lt;br /&gt;
We may want to start our own distro with the following constraints:&lt;br /&gt;
* Multiboot: small utilities/compilations + bull blown light OS&lt;br /&gt;
* Aiming at maximum hardware compatibility, possibly using liveCD technology (knoppix-based distros)&lt;br /&gt;
* Aiming at minimum resource+system footprint, and boot speed&lt;br /&gt;
* Being able to install software temporary (for the session) or permanently, upgradable&lt;br /&gt;
* Being able to use the phone features at the same time (access pim, data &amp;amp; calls)&lt;br /&gt;
&lt;br /&gt;
Optimally, being able to charge the device while plugged in would be great too.&lt;br /&gt;
&lt;br /&gt;
==About USB Booting==&lt;br /&gt;
&lt;br /&gt;
From [http://www.damnsmalllinux.org/wiki/index.php/USB_Booting DSL Wiki]:&lt;br /&gt;
&lt;br /&gt;
Older computer BIOS usually do not support direct booting from a USB device. Around 2001, PC motherboard manufacturers started to add USB boot support.&lt;br /&gt;
&lt;br /&gt;
There are two common BIOS methods for direct USB booting:&lt;br /&gt;
* One method is called the &amp;quot;USBHDD&amp;quot; method and it is used to support the booting of standard USB mass storage devices that are configured like a normal PC hard drive.&lt;br /&gt;
* The other method is called the &amp;quot;USBZIP&amp;quot; method and it supports booting from a USB storage device that behaves like the original IOMEGA ZIP drive with USB support. &lt;br /&gt;
&lt;br /&gt;
Most computers (just about all Dells, for example) made today have a BIOS that supports the USBHDD method so I expect that this will eventually become the standard way to boot a USB device. However, many motherboards will support BOTH methods, and many older motherboards have USBZIP support.&lt;br /&gt;
&lt;br /&gt;
Some newer BIOSs which support USB 2.0 will not boot from an older pen drive. Using a USB 2.0 compliant one usually solves this problem. Also, some older BIOSs which only support USB 1.1 will not boot from newer drives which support USB 2.0!&lt;br /&gt;
&lt;br /&gt;
Some USB keys don't boot. If this is the case, it may be possible to fix them by installing a new master boot record. (Most keys boot OK by default; some cannot be fixed even by doing this. However, it helps in some cases). Run the command:&lt;br /&gt;
&lt;br /&gt;
  lilo -M /dev/sda&lt;br /&gt;
&lt;br /&gt;
==USB Booting in Neo1973's kernel==&lt;br /&gt;
&lt;br /&gt;
Although there is very little information about it, the g_storage kernel module is responsible for the Neo's mass storage mode. So the boot-or-not criteria might rely on this very module.&lt;br /&gt;
&lt;br /&gt;
==TODO==&lt;br /&gt;
&lt;br /&gt;
Testing/further research has to be conducted to determine:&lt;br /&gt;
* if a bootable-flagged partition / grub doesn't mess openmoko up&lt;br /&gt;
* if the phone can still act as a phone, or if the booted os can use the gprs functions&lt;br /&gt;
* if the phone can recharge on mass storage mode (from the usb cable)&lt;br /&gt;
* if a dedicated partition for each payload is needed (see memtest example...)&lt;br /&gt;
* if multi-boot is possible: grub?&lt;br /&gt;
&lt;br /&gt;
==Linux distro Howto's: liveUSB creation==&lt;br /&gt;
&lt;br /&gt;
In short:&lt;br /&gt;
#Mount USB drive, with e.g. mount /dev/sda1 /flash - can be either FAT16 or FAT32!&lt;br /&gt;
#Mount ISO image, with e.g. mount /tmp/dsl-3.2.iso /tmp/iso -o loop&lt;br /&gt;
#Copy all contents from ISO to USB drive: cp -vr /tmp/iso/* /flash/&lt;br /&gt;
#Rename and move syslinux files to root directory: mv /flash/boot/isolinux/* /flash/&lt;br /&gt;
#Rename isolinux.cfg: mv /flash/isolinux.cfg /flash/syslinux.cfg&lt;br /&gt;
#Unmount USB drive: umount /flash&lt;br /&gt;
#Install syslinux: syslinux /dev/sda1 and eventually set the MBR boot flag for this partition (with fdisk). &lt;br /&gt;
&lt;br /&gt;
*Fedora Core's [http://revisor.fedoraunity.org Revisor] enables easy GUI-driven ISO customization, allowing to choose the output medium (CD/DVD/USB)&lt;br /&gt;
*[http://www.damnsmalllinux.org/wiki/index.php/Installing_to_a_USB_Flash_Drive Installing DSL to USB device - using grub]&lt;br /&gt;
*[http://wiki.debian.org/BootUsb Debian BootUSB - using Lilo]&lt;br /&gt;
*[http://www.debuntu.org/how-to-install-ubuntu-linux-on-usb-bar Howto install ubuntu (or any other distro) on usb stick]&lt;br /&gt;
*[http://www.gentoo.org/doc/en/liveusb.xml Gentoo on usb stick]&lt;br /&gt;
*[http://pendrivelinux.com/ Windows &amp;amp; Linux tutorials &amp;amp; resources]:     &lt;br /&gt;
    * Flash installation via Windows: XUbuntu, DSL, Knoppix, Slax, MiniMe&lt;br /&gt;
    * Flash installation via Linux: Ubuntu Edgy, Knoppix, PCLinuxOS&lt;br /&gt;
&lt;br /&gt;
'''Transflash partitioning schema example'''&lt;br /&gt;
&lt;br /&gt;
* 2 Gb: /dev/sd? (where N is the transflash's number)&lt;br /&gt;
* 700 Mb: /dev/sd?1 : containing bootable iso, FAT16&lt;br /&gt;
* 1300 Mb: /dev/sd?2 : openmoko &amp;amp; bootable os home partition, EXT3?&lt;br /&gt;
* + eventually a swap&lt;br /&gt;
&lt;br /&gt;
The limitation of this method is that the booted OS is static (not-self modifiable). There's the option to install linux using the partition, but it's not really mobility-oriented (liveCDs are optimized for maximum autoconfiguration).&lt;br /&gt;
&lt;br /&gt;
==Alternative methods==&lt;br /&gt;
&lt;br /&gt;
===Booting ISOs ?===&lt;br /&gt;
&lt;br /&gt;
* Grub? From [http://www.freesoftwaremagazine.com/articles/grub_intro#comment-12900 How to install grub on an usb pendrive]:&lt;br /&gt;
    If you want to boot from a iso file on a harddisk, do something in menu.lst like&lt;br /&gt;
    title Boot from iso on a harddisk&lt;br /&gt;
    map (hdX,Y)/your.iso (hdZ)&lt;br /&gt;
    map --rehook&lt;br /&gt;
    chainloader (hdZ)+1&lt;br /&gt;
    rootnoverify (hdZ)&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
Grub &amp;amp; memdisk can boot floppy images, but (AFAIK) not isos. Example from the stock /boot/grub/menu.lst ubuntu:&lt;br /&gt;
    title           Ubuntu, memtest86+&lt;br /&gt;
    root            (hd0,2)&lt;br /&gt;
    kernel          /memtest86+.bin&lt;br /&gt;
    quiet&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
''Using the memdisk kernel from the syslinux package, you can load disk images and execute them in a non-emulated environment.''&lt;br /&gt;
&lt;br /&gt;
* [http://www.knoppix.net/wiki/Cheat_Codes knoppix '''bootfrom''' cheatcode]&lt;br /&gt;
&lt;br /&gt;
    bootfrom=/dev/hda1/KNX.iso &lt;br /&gt;
&lt;br /&gt;
Bootfrom needs access to a running Knoppix-System '''with the same Kernel as the Bootkernel''', before it is able to mount the partition / ISO-Image.  &lt;br /&gt;
&lt;br /&gt;
* Maybe there's a way to achieve a boot cd iso selecter see ([http://www.linuxquestions.org/questions/showthread.php?t=528840 this post])&lt;br /&gt;
* virtualization-oriented distro... ex [http://unit.aist.go.jp/itri/knoppix/xen/index-en.html Xenoppix] Cons: would work best only on modern VT-capable computers. What about a very minimal distribution (say DSL without X) kqemu-enblaed, booting into an ncurses iso-loader? The delicate part would be on the networking side.&lt;br /&gt;
&lt;br /&gt;
===Zero-Install / Networked systems===&lt;br /&gt;
&lt;br /&gt;
*[http://klik.atekon.de/wiki/index.php/Main_Page Klik] with more than 1000 packages ported. See [http://klik.atekon.de/wiki/index.php/Comparison comparison chart].&lt;br /&gt;
*[http://0install.net/index.html The Zero Install System], with automatic dependancies, upgrading. See [http://0install.net/matrix.html] comparison chart.&lt;br /&gt;
*Why not rolling a [http://wiki.rpath.com/wiki/Conary:Concepts Conary/RPath-based] distro, based on [http://www.rpath.com/rbuilder/project/rpath/ rPath linux] reference distribution ? Or choose within the available ones...&lt;br /&gt;
* The FUSE [http://httpfs.sourceforge.net/net_boot.htm httpfs] may allow pure http net booting, downloading files from a distant livecd only when needed (this image may be very minimal though).&lt;br /&gt;
* [http://developer.amazonwebservices.com/connect/thread.jspa?threadID=10271&amp;amp;start=75&amp;amp;tstart=0 some people] hare thinking of using Amazon S3 as virtual disk&lt;br /&gt;
&lt;br /&gt;
===Using Qemu to boot Linux from a flash drive within Windows===&lt;br /&gt;
&lt;br /&gt;
The following tutorial explains how to use Qemu to boot Linux from a portable USB flash device while still working within Windows. This Enables the user to have both systems running at the same time eliminating the need to restart the PC and set your BIOS options to boot Linux.&lt;br /&gt;
&lt;br /&gt;
[http://www.pendrivelinux.com/2007/03/09/use-qemu-to-boot-linux-from-windows/ PendriveLinux article]&lt;br /&gt;
&lt;br /&gt;
==Putting a vnc server on openmoko==&lt;br /&gt;
&lt;br /&gt;
That's another alternative :)&lt;br /&gt;
&lt;br /&gt;
===The BlackDog project===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;When plugged into the host computer’s USB port, BlackDog starts up, automatically launching the X Window system for Windows Xming and a software NAT router via an autorun application that the BlackDog presents to the host through a virtual USB CD-ROM. Once those applications are running, the virtual USB CD-ROM drive disconnects, and a virtual USB-to-Ethernet adapter is connected to provide the communications link.&lt;br /&gt;
&lt;br /&gt;
The host machine’s monitor, keyboard, mouse, and Internet connection are used by the BlackDog for the duration of the session.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The [http://en.wikipedia.org/wiki/BlackDog BlackDog server] project has lots of interesting concepts (and software).&lt;br /&gt;
&lt;br /&gt;
==Interesting distros/payloads==&lt;br /&gt;
&lt;br /&gt;
'''System diagnostics / recovery'''&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Memtest Memtest86+] Very small&lt;br /&gt;
*[http://www.ultimatebootcd.com/ The Ultimate Boot CD]&lt;br /&gt;
*[http://www.sysresccd.org/Main_Page System Rescue CD]&lt;br /&gt;
*[http://www.tux.org/pub/people/kent-robotti/looplinux/rip/ Recovery IS Possible] &amp;lt; 80 MB&lt;br /&gt;
&lt;br /&gt;
'''General purpose'''&lt;br /&gt;
*[http://jinx-linux.sourceforge.net/ jinx-linux] &amp;lt; 50 MB&lt;br /&gt;
*[http://knoppix.com/ Knoppix] 700 MB CD-ROM&lt;br /&gt;
*[http://www.puppylinux.org PuppyLinux] &amp;lt; 100 MB&lt;br /&gt;
*[http://www.damnsmalllinux.org DSL] ~50 MB&lt;br /&gt;
*[http://gentoo-wiki.com/TinyGentoo#What_is_this_.3F TinyGentoo] 5 MB&lt;br /&gt;
&lt;br /&gt;
'''Security-oriented''': pentesting, forensics, anonymous webbrowsing&lt;br /&gt;
*[http://www.darknet.org.uk/2006/03/10-best-security-live-cd-distros-pen-test-forensics-recovery/ List of Security distros]&lt;br /&gt;
*[http://www.remote-exploit.org/backtrack.html Backtrack Livecd]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Anonym.OS Anonym.OS: browse the web anonymously]&lt;br /&gt;
*[http://dban.sourceforge.net/ Darik's Boot and Nuke]: ''dangerous''&lt;br /&gt;
*[http://byzgl.sourceforge.net/wiki/index.php/Main_Page Byzantine OS] is a webkiosk appliance (32/48 MB)&lt;br /&gt;
&lt;br /&gt;
The SabayonLinux distro offers a lot of [http://www.sabayonlinux.org/wiki/index.php?title=Sabayon_Linux#Boot_Methods_for_special_ways_of_using_Sabayon boot cheatcodes], such as booting onto GeexBox. We should take a look at the method used.&lt;br /&gt;
&lt;br /&gt;
'''[http://www.livecdlist.com/ List of live distros @ livecdlist.com]''' ''Includes sizes''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/List_of_LiveDistros List of live distros @ wikipedia]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://distrowatch.com/dwres.php?resource=cd List of live distros @ distrowatch]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB article]'''&lt;br /&gt;
&lt;br /&gt;
[[Category:Ideas]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro</id>
		<title>Wishlist/LiveUSB distro</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro"/>
				<updated>2007-06-20T22:51:15Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Using Qemu to boot Linux from a flash drive within Windows */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{wishlist}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
NOTE: this page may be renamed: portable destkop&lt;br /&gt;
&lt;br /&gt;
An openmoko device could act as '''the perfect geeky swiss knive''': go anywhere with your Linux desktop and tools.&lt;br /&gt;
&lt;br /&gt;
YES, there are tons of liveCDs out there, but CDs/DVDs:&lt;br /&gt;
* get easily damaged&lt;br /&gt;
* don't fit in a pocket (except for businesscard-sized ones ; too exotic...)&lt;br /&gt;
* don't update or save settings/personal data without a supplementary USB device&lt;br /&gt;
&lt;br /&gt;
YES, there are LiveUSB distros but:&lt;br /&gt;
* a Neo/OpenMoko device IS sort of an USB stick; one object is better than two&lt;br /&gt;
* i carry my cellphone everywhere, not my USB stick&lt;br /&gt;
* there is almost no security on USB sticks (nothing like cryptoloop devices, right?)&lt;br /&gt;
&lt;br /&gt;
The biggest argument against these ones is that you'd have to carry an USB cable with you... But it's a standard one, which is good news :)&lt;br /&gt;
&lt;br /&gt;
Similar functionality can be found in [http://en.wikipedia.org/wiki/Wizpy the Wizpy portable media player]&lt;br /&gt;
&lt;br /&gt;
When the openmoko device is in mass storage mode, a host computer should be able to boot on it, presenting a grub menu offering to boot into several images / partitions (payloads) on the transflash: memtest, UBCD (the ultimate boot cd), a lightweight security oriented livecd distro, you name it... &lt;br /&gt;
&lt;br /&gt;
It's sometimes called Live USB: from [http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB definition], ''A live USB is a USB flash drive containing a full operating system which can be booted from. Live USBs are closely related to Live CDs, and are sometimes used interchangeably. Like Live CDs, Live USBs can be used for system administration, data recovery, or the testing of operating system distributions without committing to a permanent installation on the local hard drive. Many of the smaller Linux distributions can also be used from a USB flash drive.''&lt;br /&gt;
&lt;br /&gt;
Usually, all you need for this with an USB storage device (flash USB stick or external drive) is a partition, flagged &amp;quot;bootable&amp;quot; (see fdisk), containing a boot loader (say grub). But the problem is that specifications vary between motherboards, so there are variants and mandatory requirements to define (here would be a good idea), so that one can optimize/maximize the compatibility.&lt;br /&gt;
&lt;br /&gt;
==The perfect geek knife==&lt;br /&gt;
&lt;br /&gt;
We may want to start our own distro with the following constraints:&lt;br /&gt;
* Multiboot: small utilities/compilations + bull blown light OS&lt;br /&gt;
* Aiming at maximum hardware compatibility, possibly using liveCD technology (knoppix-based distros)&lt;br /&gt;
* Aiming at minimum resource+system footprint, and boot speed&lt;br /&gt;
* Being able to install software temporary (for the session) or permanently, upgradable&lt;br /&gt;
* Being able to use the phone features at the same time (access pim, data &amp;amp; calls)&lt;br /&gt;
&lt;br /&gt;
Optimally, being able to charge the device while plugged in would be great too.&lt;br /&gt;
&lt;br /&gt;
==About USB Booting==&lt;br /&gt;
&lt;br /&gt;
From [http://www.damnsmalllinux.org/wiki/index.php/USB_Booting DSL Wiki]:&lt;br /&gt;
&lt;br /&gt;
Older computer BIOS usually do not support direct booting from a USB device. Around 2001, PC motherboard manufacturers started to add USB boot support.&lt;br /&gt;
&lt;br /&gt;
There are two common BIOS methods for direct USB booting:&lt;br /&gt;
* One method is called the &amp;quot;USBHDD&amp;quot; method and it is used to support the booting of standard USB mass storage devices that are configured like a normal PC hard drive.&lt;br /&gt;
* The other method is called the &amp;quot;USBZIP&amp;quot; method and it supports booting from a USB storage device that behaves like the original IOMEGA ZIP drive with USB support. &lt;br /&gt;
&lt;br /&gt;
Most computers (just about all Dells, for example) made today have a BIOS that supports the USBHDD method so I expect that this will eventually become the standard way to boot a USB device. However, many motherboards will support BOTH methods, and many older motherboards have USBZIP support.&lt;br /&gt;
&lt;br /&gt;
Some newer BIOSs which support USB 2.0 will not boot from an older pen drive. Using a USB 2.0 compliant one usually solves this problem. Also, some older BIOSs which only support USB 1.1 will not boot from newer drives which support USB 2.0!&lt;br /&gt;
&lt;br /&gt;
Some USB keys don't boot. If this is the case, it may be possible to fix them by installing a new master boot record. (Most keys boot OK by default; some cannot be fixed even by doing this. However, it helps in some cases). Run the command:&lt;br /&gt;
&lt;br /&gt;
  lilo -M /dev/sda&lt;br /&gt;
&lt;br /&gt;
==USB Booting in Neo1973's kernel==&lt;br /&gt;
&lt;br /&gt;
Although there is very little information about it, the g_storage kernel module is responsible for the Neo's mass storage mode. So the boot-or-not criteria might rely on this very module.&lt;br /&gt;
&lt;br /&gt;
==TODO==&lt;br /&gt;
&lt;br /&gt;
Testing/further research has to be conducted to determine:&lt;br /&gt;
* if a bootable-flagged partition / grub doesn't mess openmoko up&lt;br /&gt;
* if the phone can still act as a phone, or if the booted os can use the gprs functions&lt;br /&gt;
* if the phone can recharge on mass storage mode (from the usb cable)&lt;br /&gt;
* if a dedicated partition for each payload is needed (see memtest example...)&lt;br /&gt;
* if multi-boot is possible: grub?&lt;br /&gt;
&lt;br /&gt;
==Linux distro Howto's: liveUSB creation==&lt;br /&gt;
&lt;br /&gt;
In short:&lt;br /&gt;
#Mount USB drive, with e.g. mount /dev/sda1 /flash - can be either FAT16 or FAT32!&lt;br /&gt;
#Mount ISO image, with e.g. mount /tmp/dsl-3.2.iso /tmp/iso -o loop&lt;br /&gt;
#Copy all contents from ISO to USB drive: cp -vr /tmp/iso/* /flash/&lt;br /&gt;
#Rename and move syslinux files to root directory: mv /flash/boot/isolinux/* /flash/&lt;br /&gt;
#Rename isolinux.cfg: mv /flash/isolinux.cfg /flash/syslinux.cfg&lt;br /&gt;
#Unmount USB drive: umount /flash&lt;br /&gt;
#Install syslinux: syslinux /dev/sda1 and eventually set the MBR boot flag for this partition (with fdisk). &lt;br /&gt;
&lt;br /&gt;
*Fedora Core's [http://revisor.fedoraunity.org Revisor] enables easy GUI-driven ISO customization, allowing to choose the output medium (CD/DVD/USB)&lt;br /&gt;
*[http://www.damnsmalllinux.org/wiki/index.php/Installing_to_a_USB_Flash_Drive Installing DSL to USB device - using grub]&lt;br /&gt;
*[http://wiki.debian.org/BootUsb Debian BootUSB - using Lilo]&lt;br /&gt;
*[http://www.debuntu.org/how-to-install-ubuntu-linux-on-usb-bar Howto install ubuntu (or any other distro) on usb stick]&lt;br /&gt;
*[http://www.gentoo.org/doc/en/liveusb.xml Gentoo on usb stick]&lt;br /&gt;
*[http://pendrivelinux.com/ Windows &amp;amp; Linux tutorials &amp;amp; resources]:     &lt;br /&gt;
    * Flash installation via Windows: XUbuntu, DSL, Knoppix, Slax, MiniMe&lt;br /&gt;
    * Flash installation via Linux: Ubuntu Edgy, Knoppix, PCLinuxOS&lt;br /&gt;
&lt;br /&gt;
'''Transflash partitioning schema example'''&lt;br /&gt;
&lt;br /&gt;
* 2 Gb: /dev/sd? (where N is the transflash's number)&lt;br /&gt;
* 700 Mb: /dev/sd?1 : containing bootable iso, FAT16&lt;br /&gt;
* 1300 Mb: /dev/sd?2 : openmoko &amp;amp; bootable os home partition, EXT3?&lt;br /&gt;
* + eventually a swap&lt;br /&gt;
&lt;br /&gt;
The limitation of this method is that the booted OS is static (not-self modifiable). There's the option to install linux using the partition, but it's not really mobility-oriented (liveCDs are optimized for maximum autoconfiguration).&lt;br /&gt;
&lt;br /&gt;
==Alternative methods==&lt;br /&gt;
&lt;br /&gt;
===Booting ISOs ?===&lt;br /&gt;
&lt;br /&gt;
* Grub? From [http://www.freesoftwaremagazine.com/articles/grub_intro#comment-12900 How to install grub on an usb pendrive]:&lt;br /&gt;
    If you want to boot from a iso file on a harddisk, do something in menu.lst like&lt;br /&gt;
    title Boot from iso on a harddisk&lt;br /&gt;
    map (hdX,Y)/your.iso (hdZ)&lt;br /&gt;
    map --rehook&lt;br /&gt;
    chainloader (hdZ)+1&lt;br /&gt;
    rootnoverify (hdZ)&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
Grub &amp;amp; memdisk can boot floppy images, but (AFAIK) not isos. Example from the stock /boot/grub/menu.lst ubuntu:&lt;br /&gt;
    title           Ubuntu, memtest86+&lt;br /&gt;
    root            (hd0,2)&lt;br /&gt;
    kernel          /memtest86+.bin&lt;br /&gt;
    quiet&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
''Using the memdisk kernel from the syslinux package, you can load disk images and execute them in a non-emulated environment.''&lt;br /&gt;
&lt;br /&gt;
* [http://www.knoppix.net/wiki/Cheat_Codes knoppix '''bootfrom''' cheatcode]&lt;br /&gt;
&lt;br /&gt;
    bootfrom=/dev/hda1/KNX.iso &lt;br /&gt;
&lt;br /&gt;
Bootfrom needs access to a running Knoppix-System '''with the same Kernel as the Bootkernel''', before it is able to mount the partition / ISO-Image.  &lt;br /&gt;
&lt;br /&gt;
* Maybe there's a way to achieve a boot cd iso selecter see ([http://www.linuxquestions.org/questions/showthread.php?t=528840 this post])&lt;br /&gt;
* virtualization-oriented distro... ex [http://unit.aist.go.jp/itri/knoppix/xen/index-en.html Xenoppix] Cons: would work best only on modern VT-capable computers. What about a very minimal distribution (say DSL without X) kqemu-enblaed, booting into an ncurses iso-loader? The delicate part would be on the networking side.&lt;br /&gt;
&lt;br /&gt;
===Zero-Install / Networked systems===&lt;br /&gt;
&lt;br /&gt;
*[http://klik.atekon.de/wiki/index.php/Main_Page Klik] with more than 1000 packages ported. See [http://klik.atekon.de/wiki/index.php/Comparison comparison chart].&lt;br /&gt;
*[http://0install.net/index.html The Zero Install System], with automatic dependancies, upgrading. See [http://0install.net/matrix.html] comparison chart.&lt;br /&gt;
*Why not rolling a [http://wiki.rpath.com/wiki/Conary:Concepts Conary/RPath-based] distro, based on [http://www.rpath.com/rbuilder/project/rpath/ rPath linux] reference distribution ? Or choose within the available ones...&lt;br /&gt;
* The FUSE [http://httpfs.sourceforge.net/net_boot.htm httpfs] may allow pure http net booting, downloading files from a distant livecd only when needed (this image may be very minimal though).&lt;br /&gt;
* [http://developer.amazonwebservices.com/connect/thread.jspa?threadID=10271&amp;amp;start=75&amp;amp;tstart=0 some people] hare thinking of using Amazon S3 as virtual disk&lt;br /&gt;
&lt;br /&gt;
===Using Qemu to boot Linux from a flash drive within Windows===&lt;br /&gt;
&lt;br /&gt;
The following tutorial explains how to use Qemu to boot Linux from a portable USB flash device while still working within Windows. This Enables the user to have both systems running at the same time eliminating the need to restart the PC and set your BIOS options to boot Linux.&lt;br /&gt;
&lt;br /&gt;
[http://www.pendrivelinux.com/2007/03/09/use-qemu-to-boot-linux-from-windows/ PendriveLinux article]&lt;br /&gt;
&lt;br /&gt;
==Putting a vnc server on openmoko==&lt;br /&gt;
&lt;br /&gt;
That's another alternative :)&lt;br /&gt;
&lt;br /&gt;
==The BlackDog project==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;When plugged into the host computer’s USB port, BlackDog starts up, automatically launching the X Window system for Windows Xming and a software NAT router via an autorun application that the BlackDog presents to the host through a virtual USB CD-ROM. Once those applications are running, the virtual USB CD-ROM drive disconnects, and a virtual USB-to-Ethernet adapter is connected to provide the communications link.&lt;br /&gt;
&lt;br /&gt;
The host machine’s monitor, keyboard, mouse, and Internet connection are used by the BlackDog for the duration of the session.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The [http://en.wikipedia.org/wiki/BlackDog BlackDog server] project has lots of interesting concepts (and software).&lt;br /&gt;
&lt;br /&gt;
==Interesting distros/payloads==&lt;br /&gt;
&lt;br /&gt;
'''System diagnostics / recovery'''&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Memtest Memtest86+] Very small&lt;br /&gt;
*[http://www.ultimatebootcd.com/ The Ultimate Boot CD]&lt;br /&gt;
*[http://www.sysresccd.org/Main_Page System Rescue CD]&lt;br /&gt;
*[http://www.tux.org/pub/people/kent-robotti/looplinux/rip/ Recovery IS Possible] &amp;lt; 80 MB&lt;br /&gt;
&lt;br /&gt;
'''General purpose'''&lt;br /&gt;
*[http://jinx-linux.sourceforge.net/ jinx-linux] &amp;lt; 50 MB&lt;br /&gt;
*[http://knoppix.com/ Knoppix] 700 MB CD-ROM&lt;br /&gt;
*[http://www.puppylinux.org PuppyLinux] &amp;lt; 100 MB&lt;br /&gt;
*[http://www.damnsmalllinux.org DSL] ~50 MB&lt;br /&gt;
*[http://gentoo-wiki.com/TinyGentoo#What_is_this_.3F TinyGentoo] 5 MB&lt;br /&gt;
&lt;br /&gt;
'''Security-oriented''': pentesting, forensics, anonymous webbrowsing&lt;br /&gt;
*[http://www.darknet.org.uk/2006/03/10-best-security-live-cd-distros-pen-test-forensics-recovery/ List of Security distros]&lt;br /&gt;
*[http://www.remote-exploit.org/backtrack.html Backtrack Livecd]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Anonym.OS Anonym.OS: browse the web anonymously]&lt;br /&gt;
*[http://dban.sourceforge.net/ Darik's Boot and Nuke]: ''dangerous''&lt;br /&gt;
*[http://byzgl.sourceforge.net/wiki/index.php/Main_Page Byzantine OS] is a webkiosk appliance (32/48 MB)&lt;br /&gt;
&lt;br /&gt;
The SabayonLinux distro offers a lot of [http://www.sabayonlinux.org/wiki/index.php?title=Sabayon_Linux#Boot_Methods_for_special_ways_of_using_Sabayon boot cheatcodes], such as booting onto GeexBox. We should take a look at the method used.&lt;br /&gt;
&lt;br /&gt;
'''[http://www.livecdlist.com/ List of live distros @ livecdlist.com]''' ''Includes sizes''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/List_of_LiveDistros List of live distros @ wikipedia]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://distrowatch.com/dwres.php?resource=cd List of live distros @ distrowatch]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB article]'''&lt;br /&gt;
&lt;br /&gt;
[[Category:Ideas]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro</id>
		<title>Wishlist/LiveUSB distro</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro"/>
				<updated>2007-06-20T22:50:25Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Zero-Install / Networked systems */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{wishlist}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
NOTE: this page may be renamed: portable destkop&lt;br /&gt;
&lt;br /&gt;
An openmoko device could act as '''the perfect geeky swiss knive''': go anywhere with your Linux desktop and tools.&lt;br /&gt;
&lt;br /&gt;
YES, there are tons of liveCDs out there, but CDs/DVDs:&lt;br /&gt;
* get easily damaged&lt;br /&gt;
* don't fit in a pocket (except for businesscard-sized ones ; too exotic...)&lt;br /&gt;
* don't update or save settings/personal data without a supplementary USB device&lt;br /&gt;
&lt;br /&gt;
YES, there are LiveUSB distros but:&lt;br /&gt;
* a Neo/OpenMoko device IS sort of an USB stick; one object is better than two&lt;br /&gt;
* i carry my cellphone everywhere, not my USB stick&lt;br /&gt;
* there is almost no security on USB sticks (nothing like cryptoloop devices, right?)&lt;br /&gt;
&lt;br /&gt;
The biggest argument against these ones is that you'd have to carry an USB cable with you... But it's a standard one, which is good news :)&lt;br /&gt;
&lt;br /&gt;
Similar functionality can be found in [http://en.wikipedia.org/wiki/Wizpy the Wizpy portable media player]&lt;br /&gt;
&lt;br /&gt;
When the openmoko device is in mass storage mode, a host computer should be able to boot on it, presenting a grub menu offering to boot into several images / partitions (payloads) on the transflash: memtest, UBCD (the ultimate boot cd), a lightweight security oriented livecd distro, you name it... &lt;br /&gt;
&lt;br /&gt;
It's sometimes called Live USB: from [http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB definition], ''A live USB is a USB flash drive containing a full operating system which can be booted from. Live USBs are closely related to Live CDs, and are sometimes used interchangeably. Like Live CDs, Live USBs can be used for system administration, data recovery, or the testing of operating system distributions without committing to a permanent installation on the local hard drive. Many of the smaller Linux distributions can also be used from a USB flash drive.''&lt;br /&gt;
&lt;br /&gt;
Usually, all you need for this with an USB storage device (flash USB stick or external drive) is a partition, flagged &amp;quot;bootable&amp;quot; (see fdisk), containing a boot loader (say grub). But the problem is that specifications vary between motherboards, so there are variants and mandatory requirements to define (here would be a good idea), so that one can optimize/maximize the compatibility.&lt;br /&gt;
&lt;br /&gt;
==The perfect geek knife==&lt;br /&gt;
&lt;br /&gt;
We may want to start our own distro with the following constraints:&lt;br /&gt;
* Multiboot: small utilities/compilations + bull blown light OS&lt;br /&gt;
* Aiming at maximum hardware compatibility, possibly using liveCD technology (knoppix-based distros)&lt;br /&gt;
* Aiming at minimum resource+system footprint, and boot speed&lt;br /&gt;
* Being able to install software temporary (for the session) or permanently, upgradable&lt;br /&gt;
* Being able to use the phone features at the same time (access pim, data &amp;amp; calls)&lt;br /&gt;
&lt;br /&gt;
Optimally, being able to charge the device while plugged in would be great too.&lt;br /&gt;
&lt;br /&gt;
==About USB Booting==&lt;br /&gt;
&lt;br /&gt;
From [http://www.damnsmalllinux.org/wiki/index.php/USB_Booting DSL Wiki]:&lt;br /&gt;
&lt;br /&gt;
Older computer BIOS usually do not support direct booting from a USB device. Around 2001, PC motherboard manufacturers started to add USB boot support.&lt;br /&gt;
&lt;br /&gt;
There are two common BIOS methods for direct USB booting:&lt;br /&gt;
* One method is called the &amp;quot;USBHDD&amp;quot; method and it is used to support the booting of standard USB mass storage devices that are configured like a normal PC hard drive.&lt;br /&gt;
* The other method is called the &amp;quot;USBZIP&amp;quot; method and it supports booting from a USB storage device that behaves like the original IOMEGA ZIP drive with USB support. &lt;br /&gt;
&lt;br /&gt;
Most computers (just about all Dells, for example) made today have a BIOS that supports the USBHDD method so I expect that this will eventually become the standard way to boot a USB device. However, many motherboards will support BOTH methods, and many older motherboards have USBZIP support.&lt;br /&gt;
&lt;br /&gt;
Some newer BIOSs which support USB 2.0 will not boot from an older pen drive. Using a USB 2.0 compliant one usually solves this problem. Also, some older BIOSs which only support USB 1.1 will not boot from newer drives which support USB 2.0!&lt;br /&gt;
&lt;br /&gt;
Some USB keys don't boot. If this is the case, it may be possible to fix them by installing a new master boot record. (Most keys boot OK by default; some cannot be fixed even by doing this. However, it helps in some cases). Run the command:&lt;br /&gt;
&lt;br /&gt;
  lilo -M /dev/sda&lt;br /&gt;
&lt;br /&gt;
==USB Booting in Neo1973's kernel==&lt;br /&gt;
&lt;br /&gt;
Although there is very little information about it, the g_storage kernel module is responsible for the Neo's mass storage mode. So the boot-or-not criteria might rely on this very module.&lt;br /&gt;
&lt;br /&gt;
==TODO==&lt;br /&gt;
&lt;br /&gt;
Testing/further research has to be conducted to determine:&lt;br /&gt;
* if a bootable-flagged partition / grub doesn't mess openmoko up&lt;br /&gt;
* if the phone can still act as a phone, or if the booted os can use the gprs functions&lt;br /&gt;
* if the phone can recharge on mass storage mode (from the usb cable)&lt;br /&gt;
* if a dedicated partition for each payload is needed (see memtest example...)&lt;br /&gt;
* if multi-boot is possible: grub?&lt;br /&gt;
&lt;br /&gt;
==Linux distro Howto's: liveUSB creation==&lt;br /&gt;
&lt;br /&gt;
In short:&lt;br /&gt;
#Mount USB drive, with e.g. mount /dev/sda1 /flash - can be either FAT16 or FAT32!&lt;br /&gt;
#Mount ISO image, with e.g. mount /tmp/dsl-3.2.iso /tmp/iso -o loop&lt;br /&gt;
#Copy all contents from ISO to USB drive: cp -vr /tmp/iso/* /flash/&lt;br /&gt;
#Rename and move syslinux files to root directory: mv /flash/boot/isolinux/* /flash/&lt;br /&gt;
#Rename isolinux.cfg: mv /flash/isolinux.cfg /flash/syslinux.cfg&lt;br /&gt;
#Unmount USB drive: umount /flash&lt;br /&gt;
#Install syslinux: syslinux /dev/sda1 and eventually set the MBR boot flag for this partition (with fdisk). &lt;br /&gt;
&lt;br /&gt;
*Fedora Core's [http://revisor.fedoraunity.org Revisor] enables easy GUI-driven ISO customization, allowing to choose the output medium (CD/DVD/USB)&lt;br /&gt;
*[http://www.damnsmalllinux.org/wiki/index.php/Installing_to_a_USB_Flash_Drive Installing DSL to USB device - using grub]&lt;br /&gt;
*[http://wiki.debian.org/BootUsb Debian BootUSB - using Lilo]&lt;br /&gt;
*[http://www.debuntu.org/how-to-install-ubuntu-linux-on-usb-bar Howto install ubuntu (or any other distro) on usb stick]&lt;br /&gt;
*[http://www.gentoo.org/doc/en/liveusb.xml Gentoo on usb stick]&lt;br /&gt;
*[http://pendrivelinux.com/ Windows &amp;amp; Linux tutorials &amp;amp; resources]:     &lt;br /&gt;
    * Flash installation via Windows: XUbuntu, DSL, Knoppix, Slax, MiniMe&lt;br /&gt;
    * Flash installation via Linux: Ubuntu Edgy, Knoppix, PCLinuxOS&lt;br /&gt;
&lt;br /&gt;
'''Transflash partitioning schema example'''&lt;br /&gt;
&lt;br /&gt;
* 2 Gb: /dev/sd? (where N is the transflash's number)&lt;br /&gt;
* 700 Mb: /dev/sd?1 : containing bootable iso, FAT16&lt;br /&gt;
* 1300 Mb: /dev/sd?2 : openmoko &amp;amp; bootable os home partition, EXT3?&lt;br /&gt;
* + eventually a swap&lt;br /&gt;
&lt;br /&gt;
The limitation of this method is that the booted OS is static (not-self modifiable). There's the option to install linux using the partition, but it's not really mobility-oriented (liveCDs are optimized for maximum autoconfiguration).&lt;br /&gt;
&lt;br /&gt;
==Alternative methods==&lt;br /&gt;
&lt;br /&gt;
===Booting ISOs ?===&lt;br /&gt;
&lt;br /&gt;
* Grub? From [http://www.freesoftwaremagazine.com/articles/grub_intro#comment-12900 How to install grub on an usb pendrive]:&lt;br /&gt;
    If you want to boot from a iso file on a harddisk, do something in menu.lst like&lt;br /&gt;
    title Boot from iso on a harddisk&lt;br /&gt;
    map (hdX,Y)/your.iso (hdZ)&lt;br /&gt;
    map --rehook&lt;br /&gt;
    chainloader (hdZ)+1&lt;br /&gt;
    rootnoverify (hdZ)&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
Grub &amp;amp; memdisk can boot floppy images, but (AFAIK) not isos. Example from the stock /boot/grub/menu.lst ubuntu:&lt;br /&gt;
    title           Ubuntu, memtest86+&lt;br /&gt;
    root            (hd0,2)&lt;br /&gt;
    kernel          /memtest86+.bin&lt;br /&gt;
    quiet&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
''Using the memdisk kernel from the syslinux package, you can load disk images and execute them in a non-emulated environment.''&lt;br /&gt;
&lt;br /&gt;
* [http://www.knoppix.net/wiki/Cheat_Codes knoppix '''bootfrom''' cheatcode]&lt;br /&gt;
&lt;br /&gt;
    bootfrom=/dev/hda1/KNX.iso &lt;br /&gt;
&lt;br /&gt;
Bootfrom needs access to a running Knoppix-System '''with the same Kernel as the Bootkernel''', before it is able to mount the partition / ISO-Image.  &lt;br /&gt;
&lt;br /&gt;
* Maybe there's a way to achieve a boot cd iso selecter see ([http://www.linuxquestions.org/questions/showthread.php?t=528840 this post])&lt;br /&gt;
* virtualization-oriented distro... ex [http://unit.aist.go.jp/itri/knoppix/xen/index-en.html Xenoppix] Cons: would work best only on modern VT-capable computers. What about a very minimal distribution (say DSL without X) kqemu-enblaed, booting into an ncurses iso-loader? The delicate part would be on the networking side.&lt;br /&gt;
&lt;br /&gt;
===Zero-Install / Networked systems===&lt;br /&gt;
&lt;br /&gt;
*[http://klik.atekon.de/wiki/index.php/Main_Page Klik] with more than 1000 packages ported. See [http://klik.atekon.de/wiki/index.php/Comparison comparison chart].&lt;br /&gt;
*[http://0install.net/index.html The Zero Install System], with automatic dependancies, upgrading. See [http://0install.net/matrix.html] comparison chart.&lt;br /&gt;
*Why not rolling a [http://wiki.rpath.com/wiki/Conary:Concepts Conary/RPath-based] distro, based on [http://www.rpath.com/rbuilder/project/rpath/ rPath linux] reference distribution ? Or choose within the available ones...&lt;br /&gt;
* The FUSE [http://httpfs.sourceforge.net/net_boot.htm httpfs] may allow pure http net booting, downloading files from a distant livecd only when needed (this image may be very minimal though).&lt;br /&gt;
* [http://developer.amazonwebservices.com/connect/thread.jspa?threadID=10271&amp;amp;start=75&amp;amp;tstart=0 some people] hare thinking of using Amazon S3 as virtual disk&lt;br /&gt;
&lt;br /&gt;
==Using Qemu to boot Linux from a flash drive within Windows==&lt;br /&gt;
&lt;br /&gt;
The following tutorial explains how to use Qemu to boot Linux from a portable USB flash device while still working within Windows. This Enables the user to have both systems running at the same time eliminating the need to restart the PC and set your BIOS options to boot Linux.&lt;br /&gt;
&lt;br /&gt;
[http://www.pendrivelinux.com/2007/03/09/use-qemu-to-boot-linux-from-windows/ PendriveLinux article]&lt;br /&gt;
&lt;br /&gt;
==Putting a vnc server on openmoko==&lt;br /&gt;
&lt;br /&gt;
That's another alternative :)&lt;br /&gt;
&lt;br /&gt;
==The BlackDog project==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;When plugged into the host computer’s USB port, BlackDog starts up, automatically launching the X Window system for Windows Xming and a software NAT router via an autorun application that the BlackDog presents to the host through a virtual USB CD-ROM. Once those applications are running, the virtual USB CD-ROM drive disconnects, and a virtual USB-to-Ethernet adapter is connected to provide the communications link.&lt;br /&gt;
&lt;br /&gt;
The host machine’s monitor, keyboard, mouse, and Internet connection are used by the BlackDog for the duration of the session.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The [http://en.wikipedia.org/wiki/BlackDog BlackDog server] project has lots of interesting concepts (and software).&lt;br /&gt;
&lt;br /&gt;
==Interesting distros/payloads==&lt;br /&gt;
&lt;br /&gt;
'''System diagnostics / recovery'''&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Memtest Memtest86+] Very small&lt;br /&gt;
*[http://www.ultimatebootcd.com/ The Ultimate Boot CD]&lt;br /&gt;
*[http://www.sysresccd.org/Main_Page System Rescue CD]&lt;br /&gt;
*[http://www.tux.org/pub/people/kent-robotti/looplinux/rip/ Recovery IS Possible] &amp;lt; 80 MB&lt;br /&gt;
&lt;br /&gt;
'''General purpose'''&lt;br /&gt;
*[http://jinx-linux.sourceforge.net/ jinx-linux] &amp;lt; 50 MB&lt;br /&gt;
*[http://knoppix.com/ Knoppix] 700 MB CD-ROM&lt;br /&gt;
*[http://www.puppylinux.org PuppyLinux] &amp;lt; 100 MB&lt;br /&gt;
*[http://www.damnsmalllinux.org DSL] ~50 MB&lt;br /&gt;
*[http://gentoo-wiki.com/TinyGentoo#What_is_this_.3F TinyGentoo] 5 MB&lt;br /&gt;
&lt;br /&gt;
'''Security-oriented''': pentesting, forensics, anonymous webbrowsing&lt;br /&gt;
*[http://www.darknet.org.uk/2006/03/10-best-security-live-cd-distros-pen-test-forensics-recovery/ List of Security distros]&lt;br /&gt;
*[http://www.remote-exploit.org/backtrack.html Backtrack Livecd]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Anonym.OS Anonym.OS: browse the web anonymously]&lt;br /&gt;
*[http://dban.sourceforge.net/ Darik's Boot and Nuke]: ''dangerous''&lt;br /&gt;
*[http://byzgl.sourceforge.net/wiki/index.php/Main_Page Byzantine OS] is a webkiosk appliance (32/48 MB)&lt;br /&gt;
&lt;br /&gt;
The SabayonLinux distro offers a lot of [http://www.sabayonlinux.org/wiki/index.php?title=Sabayon_Linux#Boot_Methods_for_special_ways_of_using_Sabayon boot cheatcodes], such as booting onto GeexBox. We should take a look at the method used.&lt;br /&gt;
&lt;br /&gt;
'''[http://www.livecdlist.com/ List of live distros @ livecdlist.com]''' ''Includes sizes''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/List_of_LiveDistros List of live distros @ wikipedia]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://distrowatch.com/dwres.php?resource=cd List of live distros @ distrowatch]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB article]'''&lt;br /&gt;
&lt;br /&gt;
[[Category:Ideas]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro</id>
		<title>Wishlist/LiveUSB distro</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro"/>
				<updated>2007-06-20T22:49:43Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Zero-Install systems */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{wishlist}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
NOTE: this page may be renamed: portable destkop&lt;br /&gt;
&lt;br /&gt;
An openmoko device could act as '''the perfect geeky swiss knive''': go anywhere with your Linux desktop and tools.&lt;br /&gt;
&lt;br /&gt;
YES, there are tons of liveCDs out there, but CDs/DVDs:&lt;br /&gt;
* get easily damaged&lt;br /&gt;
* don't fit in a pocket (except for businesscard-sized ones ; too exotic...)&lt;br /&gt;
* don't update or save settings/personal data without a supplementary USB device&lt;br /&gt;
&lt;br /&gt;
YES, there are LiveUSB distros but:&lt;br /&gt;
* a Neo/OpenMoko device IS sort of an USB stick; one object is better than two&lt;br /&gt;
* i carry my cellphone everywhere, not my USB stick&lt;br /&gt;
* there is almost no security on USB sticks (nothing like cryptoloop devices, right?)&lt;br /&gt;
&lt;br /&gt;
The biggest argument against these ones is that you'd have to carry an USB cable with you... But it's a standard one, which is good news :)&lt;br /&gt;
&lt;br /&gt;
Similar functionality can be found in [http://en.wikipedia.org/wiki/Wizpy the Wizpy portable media player]&lt;br /&gt;
&lt;br /&gt;
When the openmoko device is in mass storage mode, a host computer should be able to boot on it, presenting a grub menu offering to boot into several images / partitions (payloads) on the transflash: memtest, UBCD (the ultimate boot cd), a lightweight security oriented livecd distro, you name it... &lt;br /&gt;
&lt;br /&gt;
It's sometimes called Live USB: from [http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB definition], ''A live USB is a USB flash drive containing a full operating system which can be booted from. Live USBs are closely related to Live CDs, and are sometimes used interchangeably. Like Live CDs, Live USBs can be used for system administration, data recovery, or the testing of operating system distributions without committing to a permanent installation on the local hard drive. Many of the smaller Linux distributions can also be used from a USB flash drive.''&lt;br /&gt;
&lt;br /&gt;
Usually, all you need for this with an USB storage device (flash USB stick or external drive) is a partition, flagged &amp;quot;bootable&amp;quot; (see fdisk), containing a boot loader (say grub). But the problem is that specifications vary between motherboards, so there are variants and mandatory requirements to define (here would be a good idea), so that one can optimize/maximize the compatibility.&lt;br /&gt;
&lt;br /&gt;
==The perfect geek knife==&lt;br /&gt;
&lt;br /&gt;
We may want to start our own distro with the following constraints:&lt;br /&gt;
* Multiboot: small utilities/compilations + bull blown light OS&lt;br /&gt;
* Aiming at maximum hardware compatibility, possibly using liveCD technology (knoppix-based distros)&lt;br /&gt;
* Aiming at minimum resource+system footprint, and boot speed&lt;br /&gt;
* Being able to install software temporary (for the session) or permanently, upgradable&lt;br /&gt;
* Being able to use the phone features at the same time (access pim, data &amp;amp; calls)&lt;br /&gt;
&lt;br /&gt;
Optimally, being able to charge the device while plugged in would be great too.&lt;br /&gt;
&lt;br /&gt;
==About USB Booting==&lt;br /&gt;
&lt;br /&gt;
From [http://www.damnsmalllinux.org/wiki/index.php/USB_Booting DSL Wiki]:&lt;br /&gt;
&lt;br /&gt;
Older computer BIOS usually do not support direct booting from a USB device. Around 2001, PC motherboard manufacturers started to add USB boot support.&lt;br /&gt;
&lt;br /&gt;
There are two common BIOS methods for direct USB booting:&lt;br /&gt;
* One method is called the &amp;quot;USBHDD&amp;quot; method and it is used to support the booting of standard USB mass storage devices that are configured like a normal PC hard drive.&lt;br /&gt;
* The other method is called the &amp;quot;USBZIP&amp;quot; method and it supports booting from a USB storage device that behaves like the original IOMEGA ZIP drive with USB support. &lt;br /&gt;
&lt;br /&gt;
Most computers (just about all Dells, for example) made today have a BIOS that supports the USBHDD method so I expect that this will eventually become the standard way to boot a USB device. However, many motherboards will support BOTH methods, and many older motherboards have USBZIP support.&lt;br /&gt;
&lt;br /&gt;
Some newer BIOSs which support USB 2.0 will not boot from an older pen drive. Using a USB 2.0 compliant one usually solves this problem. Also, some older BIOSs which only support USB 1.1 will not boot from newer drives which support USB 2.0!&lt;br /&gt;
&lt;br /&gt;
Some USB keys don't boot. If this is the case, it may be possible to fix them by installing a new master boot record. (Most keys boot OK by default; some cannot be fixed even by doing this. However, it helps in some cases). Run the command:&lt;br /&gt;
&lt;br /&gt;
  lilo -M /dev/sda&lt;br /&gt;
&lt;br /&gt;
==USB Booting in Neo1973's kernel==&lt;br /&gt;
&lt;br /&gt;
Although there is very little information about it, the g_storage kernel module is responsible for the Neo's mass storage mode. So the boot-or-not criteria might rely on this very module.&lt;br /&gt;
&lt;br /&gt;
==TODO==&lt;br /&gt;
&lt;br /&gt;
Testing/further research has to be conducted to determine:&lt;br /&gt;
* if a bootable-flagged partition / grub doesn't mess openmoko up&lt;br /&gt;
* if the phone can still act as a phone, or if the booted os can use the gprs functions&lt;br /&gt;
* if the phone can recharge on mass storage mode (from the usb cable)&lt;br /&gt;
* if a dedicated partition for each payload is needed (see memtest example...)&lt;br /&gt;
* if multi-boot is possible: grub?&lt;br /&gt;
&lt;br /&gt;
==Linux distro Howto's: liveUSB creation==&lt;br /&gt;
&lt;br /&gt;
In short:&lt;br /&gt;
#Mount USB drive, with e.g. mount /dev/sda1 /flash - can be either FAT16 or FAT32!&lt;br /&gt;
#Mount ISO image, with e.g. mount /tmp/dsl-3.2.iso /tmp/iso -o loop&lt;br /&gt;
#Copy all contents from ISO to USB drive: cp -vr /tmp/iso/* /flash/&lt;br /&gt;
#Rename and move syslinux files to root directory: mv /flash/boot/isolinux/* /flash/&lt;br /&gt;
#Rename isolinux.cfg: mv /flash/isolinux.cfg /flash/syslinux.cfg&lt;br /&gt;
#Unmount USB drive: umount /flash&lt;br /&gt;
#Install syslinux: syslinux /dev/sda1 and eventually set the MBR boot flag for this partition (with fdisk). &lt;br /&gt;
&lt;br /&gt;
*Fedora Core's [http://revisor.fedoraunity.org Revisor] enables easy GUI-driven ISO customization, allowing to choose the output medium (CD/DVD/USB)&lt;br /&gt;
*[http://www.damnsmalllinux.org/wiki/index.php/Installing_to_a_USB_Flash_Drive Installing DSL to USB device - using grub]&lt;br /&gt;
*[http://wiki.debian.org/BootUsb Debian BootUSB - using Lilo]&lt;br /&gt;
*[http://www.debuntu.org/how-to-install-ubuntu-linux-on-usb-bar Howto install ubuntu (or any other distro) on usb stick]&lt;br /&gt;
*[http://www.gentoo.org/doc/en/liveusb.xml Gentoo on usb stick]&lt;br /&gt;
*[http://pendrivelinux.com/ Windows &amp;amp; Linux tutorials &amp;amp; resources]:     &lt;br /&gt;
    * Flash installation via Windows: XUbuntu, DSL, Knoppix, Slax, MiniMe&lt;br /&gt;
    * Flash installation via Linux: Ubuntu Edgy, Knoppix, PCLinuxOS&lt;br /&gt;
&lt;br /&gt;
'''Transflash partitioning schema example'''&lt;br /&gt;
&lt;br /&gt;
* 2 Gb: /dev/sd? (where N is the transflash's number)&lt;br /&gt;
* 700 Mb: /dev/sd?1 : containing bootable iso, FAT16&lt;br /&gt;
* 1300 Mb: /dev/sd?2 : openmoko &amp;amp; bootable os home partition, EXT3?&lt;br /&gt;
* + eventually a swap&lt;br /&gt;
&lt;br /&gt;
The limitation of this method is that the booted OS is static (not-self modifiable). There's the option to install linux using the partition, but it's not really mobility-oriented (liveCDs are optimized for maximum autoconfiguration).&lt;br /&gt;
&lt;br /&gt;
==Alternative methods==&lt;br /&gt;
&lt;br /&gt;
===Booting ISOs ?===&lt;br /&gt;
&lt;br /&gt;
* Grub? From [http://www.freesoftwaremagazine.com/articles/grub_intro#comment-12900 How to install grub on an usb pendrive]:&lt;br /&gt;
    If you want to boot from a iso file on a harddisk, do something in menu.lst like&lt;br /&gt;
    title Boot from iso on a harddisk&lt;br /&gt;
    map (hdX,Y)/your.iso (hdZ)&lt;br /&gt;
    map --rehook&lt;br /&gt;
    chainloader (hdZ)+1&lt;br /&gt;
    rootnoverify (hdZ)&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
Grub &amp;amp; memdisk can boot floppy images, but (AFAIK) not isos. Example from the stock /boot/grub/menu.lst ubuntu:&lt;br /&gt;
    title           Ubuntu, memtest86+&lt;br /&gt;
    root            (hd0,2)&lt;br /&gt;
    kernel          /memtest86+.bin&lt;br /&gt;
    quiet&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
''Using the memdisk kernel from the syslinux package, you can load disk images and execute them in a non-emulated environment.''&lt;br /&gt;
&lt;br /&gt;
* [http://www.knoppix.net/wiki/Cheat_Codes knoppix '''bootfrom''' cheatcode]&lt;br /&gt;
&lt;br /&gt;
    bootfrom=/dev/hda1/KNX.iso &lt;br /&gt;
&lt;br /&gt;
Bootfrom needs access to a running Knoppix-System '''with the same Kernel as the Bootkernel''', before it is able to mount the partition / ISO-Image.  &lt;br /&gt;
&lt;br /&gt;
* Maybe there's a way to achieve a boot cd iso selecter see ([http://www.linuxquestions.org/questions/showthread.php?t=528840 this post])&lt;br /&gt;
* virtualization-oriented distro... ex [http://unit.aist.go.jp/itri/knoppix/xen/index-en.html Xenoppix] Cons: would work best only on modern VT-capable computers. What about a very minimal distribution (say DSL without X) kqemu-enblaed, booting into an ncurses iso-loader? The delicate part would be on the networking side.&lt;br /&gt;
&lt;br /&gt;
===Zero-Install / Networked systems===&lt;br /&gt;
&lt;br /&gt;
*[http://klik.atekon.de/wiki/index.php/Main_Page Klik] with more than 1000 packages ported. See [http://klik.atekon.de/wiki/index.php/Comparison comparison chart].&lt;br /&gt;
*[http://0install.net/index.html The Zero Install System], with automatic dependancies, upgrading. See [http://0install.net/matrix.html] comparison chart.&lt;br /&gt;
*Why not rolling a [http://wiki.rpath.com/wiki/Conary:Concepts Conary/RPath-based] distro, based on [http://www.rpath.com/rbuilder/project/rpath/ rPath linux] reference distribution ? Or choose within the available ones...&lt;br /&gt;
* The FUSE [http://httpfs.sourceforge.net/net_boot.htm httpfs] may allow pure http net booting, downloading files from a distant livecd only when needed (this image may be very minimal though).&lt;br /&gt;
* [http://developer.amazonwebservices.com/connect/thread.jspa?threadID=10271&amp;amp;start=75&amp;amp;tstart=0 some people] hare thinking of using Amzon S3 as virtual disk&lt;br /&gt;
&lt;br /&gt;
==Using Qemu to boot Linux from a flash drive within Windows==&lt;br /&gt;
&lt;br /&gt;
The following tutorial explains how to use Qemu to boot Linux from a portable USB flash device while still working within Windows. This Enables the user to have both systems running at the same time eliminating the need to restart the PC and set your BIOS options to boot Linux.&lt;br /&gt;
&lt;br /&gt;
[http://www.pendrivelinux.com/2007/03/09/use-qemu-to-boot-linux-from-windows/ PendriveLinux article]&lt;br /&gt;
&lt;br /&gt;
==Putting a vnc server on openmoko==&lt;br /&gt;
&lt;br /&gt;
That's another alternative :)&lt;br /&gt;
&lt;br /&gt;
==The BlackDog project==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;When plugged into the host computer’s USB port, BlackDog starts up, automatically launching the X Window system for Windows Xming and a software NAT router via an autorun application that the BlackDog presents to the host through a virtual USB CD-ROM. Once those applications are running, the virtual USB CD-ROM drive disconnects, and a virtual USB-to-Ethernet adapter is connected to provide the communications link.&lt;br /&gt;
&lt;br /&gt;
The host machine’s monitor, keyboard, mouse, and Internet connection are used by the BlackDog for the duration of the session.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The [http://en.wikipedia.org/wiki/BlackDog BlackDog server] project has lots of interesting concepts (and software).&lt;br /&gt;
&lt;br /&gt;
==Interesting distros/payloads==&lt;br /&gt;
&lt;br /&gt;
'''System diagnostics / recovery'''&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Memtest Memtest86+] Very small&lt;br /&gt;
*[http://www.ultimatebootcd.com/ The Ultimate Boot CD]&lt;br /&gt;
*[http://www.sysresccd.org/Main_Page System Rescue CD]&lt;br /&gt;
*[http://www.tux.org/pub/people/kent-robotti/looplinux/rip/ Recovery IS Possible] &amp;lt; 80 MB&lt;br /&gt;
&lt;br /&gt;
'''General purpose'''&lt;br /&gt;
*[http://jinx-linux.sourceforge.net/ jinx-linux] &amp;lt; 50 MB&lt;br /&gt;
*[http://knoppix.com/ Knoppix] 700 MB CD-ROM&lt;br /&gt;
*[http://www.puppylinux.org PuppyLinux] &amp;lt; 100 MB&lt;br /&gt;
*[http://www.damnsmalllinux.org DSL] ~50 MB&lt;br /&gt;
*[http://gentoo-wiki.com/TinyGentoo#What_is_this_.3F TinyGentoo] 5 MB&lt;br /&gt;
&lt;br /&gt;
'''Security-oriented''': pentesting, forensics, anonymous webbrowsing&lt;br /&gt;
*[http://www.darknet.org.uk/2006/03/10-best-security-live-cd-distros-pen-test-forensics-recovery/ List of Security distros]&lt;br /&gt;
*[http://www.remote-exploit.org/backtrack.html Backtrack Livecd]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Anonym.OS Anonym.OS: browse the web anonymously]&lt;br /&gt;
*[http://dban.sourceforge.net/ Darik's Boot and Nuke]: ''dangerous''&lt;br /&gt;
*[http://byzgl.sourceforge.net/wiki/index.php/Main_Page Byzantine OS] is a webkiosk appliance (32/48 MB)&lt;br /&gt;
&lt;br /&gt;
The SabayonLinux distro offers a lot of [http://www.sabayonlinux.org/wiki/index.php?title=Sabayon_Linux#Boot_Methods_for_special_ways_of_using_Sabayon boot cheatcodes], such as booting onto GeexBox. We should take a look at the method used.&lt;br /&gt;
&lt;br /&gt;
'''[http://www.livecdlist.com/ List of live distros @ livecdlist.com]''' ''Includes sizes''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/List_of_LiveDistros List of live distros @ wikipedia]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://distrowatch.com/dwres.php?resource=cd List of live distros @ distrowatch]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB article]'''&lt;br /&gt;
&lt;br /&gt;
[[Category:Ideas]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro</id>
		<title>Wishlist/LiveUSB distro</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro"/>
				<updated>2007-06-20T22:48:09Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Zero-Install systems */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{wishlist}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
NOTE: this page may be renamed: portable destkop&lt;br /&gt;
&lt;br /&gt;
An openmoko device could act as '''the perfect geeky swiss knive''': go anywhere with your Linux desktop and tools.&lt;br /&gt;
&lt;br /&gt;
YES, there are tons of liveCDs out there, but CDs/DVDs:&lt;br /&gt;
* get easily damaged&lt;br /&gt;
* don't fit in a pocket (except for businesscard-sized ones ; too exotic...)&lt;br /&gt;
* don't update or save settings/personal data without a supplementary USB device&lt;br /&gt;
&lt;br /&gt;
YES, there are LiveUSB distros but:&lt;br /&gt;
* a Neo/OpenMoko device IS sort of an USB stick; one object is better than two&lt;br /&gt;
* i carry my cellphone everywhere, not my USB stick&lt;br /&gt;
* there is almost no security on USB sticks (nothing like cryptoloop devices, right?)&lt;br /&gt;
&lt;br /&gt;
The biggest argument against these ones is that you'd have to carry an USB cable with you... But it's a standard one, which is good news :)&lt;br /&gt;
&lt;br /&gt;
Similar functionality can be found in [http://en.wikipedia.org/wiki/Wizpy the Wizpy portable media player]&lt;br /&gt;
&lt;br /&gt;
When the openmoko device is in mass storage mode, a host computer should be able to boot on it, presenting a grub menu offering to boot into several images / partitions (payloads) on the transflash: memtest, UBCD (the ultimate boot cd), a lightweight security oriented livecd distro, you name it... &lt;br /&gt;
&lt;br /&gt;
It's sometimes called Live USB: from [http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB definition], ''A live USB is a USB flash drive containing a full operating system which can be booted from. Live USBs are closely related to Live CDs, and are sometimes used interchangeably. Like Live CDs, Live USBs can be used for system administration, data recovery, or the testing of operating system distributions without committing to a permanent installation on the local hard drive. Many of the smaller Linux distributions can also be used from a USB flash drive.''&lt;br /&gt;
&lt;br /&gt;
Usually, all you need for this with an USB storage device (flash USB stick or external drive) is a partition, flagged &amp;quot;bootable&amp;quot; (see fdisk), containing a boot loader (say grub). But the problem is that specifications vary between motherboards, so there are variants and mandatory requirements to define (here would be a good idea), so that one can optimize/maximize the compatibility.&lt;br /&gt;
&lt;br /&gt;
==The perfect geek knife==&lt;br /&gt;
&lt;br /&gt;
We may want to start our own distro with the following constraints:&lt;br /&gt;
* Multiboot: small utilities/compilations + bull blown light OS&lt;br /&gt;
* Aiming at maximum hardware compatibility, possibly using liveCD technology (knoppix-based distros)&lt;br /&gt;
* Aiming at minimum resource+system footprint, and boot speed&lt;br /&gt;
* Being able to install software temporary (for the session) or permanently, upgradable&lt;br /&gt;
* Being able to use the phone features at the same time (access pim, data &amp;amp; calls)&lt;br /&gt;
&lt;br /&gt;
Optimally, being able to charge the device while plugged in would be great too.&lt;br /&gt;
&lt;br /&gt;
==About USB Booting==&lt;br /&gt;
&lt;br /&gt;
From [http://www.damnsmalllinux.org/wiki/index.php/USB_Booting DSL Wiki]:&lt;br /&gt;
&lt;br /&gt;
Older computer BIOS usually do not support direct booting from a USB device. Around 2001, PC motherboard manufacturers started to add USB boot support.&lt;br /&gt;
&lt;br /&gt;
There are two common BIOS methods for direct USB booting:&lt;br /&gt;
* One method is called the &amp;quot;USBHDD&amp;quot; method and it is used to support the booting of standard USB mass storage devices that are configured like a normal PC hard drive.&lt;br /&gt;
* The other method is called the &amp;quot;USBZIP&amp;quot; method and it supports booting from a USB storage device that behaves like the original IOMEGA ZIP drive with USB support. &lt;br /&gt;
&lt;br /&gt;
Most computers (just about all Dells, for example) made today have a BIOS that supports the USBHDD method so I expect that this will eventually become the standard way to boot a USB device. However, many motherboards will support BOTH methods, and many older motherboards have USBZIP support.&lt;br /&gt;
&lt;br /&gt;
Some newer BIOSs which support USB 2.0 will not boot from an older pen drive. Using a USB 2.0 compliant one usually solves this problem. Also, some older BIOSs which only support USB 1.1 will not boot from newer drives which support USB 2.0!&lt;br /&gt;
&lt;br /&gt;
Some USB keys don't boot. If this is the case, it may be possible to fix them by installing a new master boot record. (Most keys boot OK by default; some cannot be fixed even by doing this. However, it helps in some cases). Run the command:&lt;br /&gt;
&lt;br /&gt;
  lilo -M /dev/sda&lt;br /&gt;
&lt;br /&gt;
==USB Booting in Neo1973's kernel==&lt;br /&gt;
&lt;br /&gt;
Although there is very little information about it, the g_storage kernel module is responsible for the Neo's mass storage mode. So the boot-or-not criteria might rely on this very module.&lt;br /&gt;
&lt;br /&gt;
==TODO==&lt;br /&gt;
&lt;br /&gt;
Testing/further research has to be conducted to determine:&lt;br /&gt;
* if a bootable-flagged partition / grub doesn't mess openmoko up&lt;br /&gt;
* if the phone can still act as a phone, or if the booted os can use the gprs functions&lt;br /&gt;
* if the phone can recharge on mass storage mode (from the usb cable)&lt;br /&gt;
* if a dedicated partition for each payload is needed (see memtest example...)&lt;br /&gt;
* if multi-boot is possible: grub?&lt;br /&gt;
&lt;br /&gt;
==Linux distro Howto's: liveUSB creation==&lt;br /&gt;
&lt;br /&gt;
In short:&lt;br /&gt;
#Mount USB drive, with e.g. mount /dev/sda1 /flash - can be either FAT16 or FAT32!&lt;br /&gt;
#Mount ISO image, with e.g. mount /tmp/dsl-3.2.iso /tmp/iso -o loop&lt;br /&gt;
#Copy all contents from ISO to USB drive: cp -vr /tmp/iso/* /flash/&lt;br /&gt;
#Rename and move syslinux files to root directory: mv /flash/boot/isolinux/* /flash/&lt;br /&gt;
#Rename isolinux.cfg: mv /flash/isolinux.cfg /flash/syslinux.cfg&lt;br /&gt;
#Unmount USB drive: umount /flash&lt;br /&gt;
#Install syslinux: syslinux /dev/sda1 and eventually set the MBR boot flag for this partition (with fdisk). &lt;br /&gt;
&lt;br /&gt;
*Fedora Core's [http://revisor.fedoraunity.org Revisor] enables easy GUI-driven ISO customization, allowing to choose the output medium (CD/DVD/USB)&lt;br /&gt;
*[http://www.damnsmalllinux.org/wiki/index.php/Installing_to_a_USB_Flash_Drive Installing DSL to USB device - using grub]&lt;br /&gt;
*[http://wiki.debian.org/BootUsb Debian BootUSB - using Lilo]&lt;br /&gt;
*[http://www.debuntu.org/how-to-install-ubuntu-linux-on-usb-bar Howto install ubuntu (or any other distro) on usb stick]&lt;br /&gt;
*[http://www.gentoo.org/doc/en/liveusb.xml Gentoo on usb stick]&lt;br /&gt;
*[http://pendrivelinux.com/ Windows &amp;amp; Linux tutorials &amp;amp; resources]:     &lt;br /&gt;
    * Flash installation via Windows: XUbuntu, DSL, Knoppix, Slax, MiniMe&lt;br /&gt;
    * Flash installation via Linux: Ubuntu Edgy, Knoppix, PCLinuxOS&lt;br /&gt;
&lt;br /&gt;
'''Transflash partitioning schema example'''&lt;br /&gt;
&lt;br /&gt;
* 2 Gb: /dev/sd? (where N is the transflash's number)&lt;br /&gt;
* 700 Mb: /dev/sd?1 : containing bootable iso, FAT16&lt;br /&gt;
* 1300 Mb: /dev/sd?2 : openmoko &amp;amp; bootable os home partition, EXT3?&lt;br /&gt;
* + eventually a swap&lt;br /&gt;
&lt;br /&gt;
The limitation of this method is that the booted OS is static (not-self modifiable). There's the option to install linux using the partition, but it's not really mobility-oriented (liveCDs are optimized for maximum autoconfiguration).&lt;br /&gt;
&lt;br /&gt;
==Alternative methods==&lt;br /&gt;
&lt;br /&gt;
===Booting ISOs ?===&lt;br /&gt;
&lt;br /&gt;
* Grub? From [http://www.freesoftwaremagazine.com/articles/grub_intro#comment-12900 How to install grub on an usb pendrive]:&lt;br /&gt;
    If you want to boot from a iso file on a harddisk, do something in menu.lst like&lt;br /&gt;
    title Boot from iso on a harddisk&lt;br /&gt;
    map (hdX,Y)/your.iso (hdZ)&lt;br /&gt;
    map --rehook&lt;br /&gt;
    chainloader (hdZ)+1&lt;br /&gt;
    rootnoverify (hdZ)&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
Grub &amp;amp; memdisk can boot floppy images, but (AFAIK) not isos. Example from the stock /boot/grub/menu.lst ubuntu:&lt;br /&gt;
    title           Ubuntu, memtest86+&lt;br /&gt;
    root            (hd0,2)&lt;br /&gt;
    kernel          /memtest86+.bin&lt;br /&gt;
    quiet&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
''Using the memdisk kernel from the syslinux package, you can load disk images and execute them in a non-emulated environment.''&lt;br /&gt;
&lt;br /&gt;
* [http://www.knoppix.net/wiki/Cheat_Codes knoppix '''bootfrom''' cheatcode]&lt;br /&gt;
&lt;br /&gt;
    bootfrom=/dev/hda1/KNX.iso &lt;br /&gt;
&lt;br /&gt;
Bootfrom needs access to a running Knoppix-System '''with the same Kernel as the Bootkernel''', before it is able to mount the partition / ISO-Image.  &lt;br /&gt;
&lt;br /&gt;
* Maybe there's a way to achieve a boot cd iso selecter see ([http://www.linuxquestions.org/questions/showthread.php?t=528840 this post])&lt;br /&gt;
* virtualization-oriented distro... ex [http://unit.aist.go.jp/itri/knoppix/xen/index-en.html Xenoppix] Cons: would work best only on modern VT-capable computers. What about a very minimal distribution (say DSL without X) kqemu-enblaed, booting into an ncurses iso-loader? The delicate part would be on the networking side.&lt;br /&gt;
&lt;br /&gt;
===Zero-Install systems===&lt;br /&gt;
&lt;br /&gt;
For limited storage devices (such as a transflash device), zero-install systems can be very interesting: you can download and run software, without installing it.&lt;br /&gt;
&lt;br /&gt;
The most interesting projects so far seem to be:&lt;br /&gt;
*[http://klik.atekon.de/wiki/index.php/Main_Page Klik] with more than 1000 packages ported. See [http://klik.atekon.de/wiki/index.php/Comparison comparison chart].&lt;br /&gt;
*[http://0install.net/index.html The Zero Install System], with automatic dependancies, upgrading. See [http://0install.net/matrix.html] comparison chart.&lt;br /&gt;
*Why not rolling a [http://wiki.rpath.com/wiki/Conary:Concepts Conary/RPath-based] distro, based on [http://www.rpath.com/rbuilder/project/rpath/ rPath linux] reference distribution ? Or choose within the available ones...&lt;br /&gt;
* The FUSE [http://httpfs.sourceforge.net/net_boot.htm httpfs] may allow pure http net booting, downloading files from a distant livecd only when needed (this image may be very minimal though).&lt;br /&gt;
&lt;br /&gt;
One may choose/begin a zero-install-enabled distro for minimal footprint.&lt;br /&gt;
&lt;br /&gt;
==Using Qemu to boot Linux from a flash drive within Windows==&lt;br /&gt;
&lt;br /&gt;
The following tutorial explains how to use Qemu to boot Linux from a portable USB flash device while still working within Windows. This Enables the user to have both systems running at the same time eliminating the need to restart the PC and set your BIOS options to boot Linux.&lt;br /&gt;
&lt;br /&gt;
[http://www.pendrivelinux.com/2007/03/09/use-qemu-to-boot-linux-from-windows/ PendriveLinux article]&lt;br /&gt;
&lt;br /&gt;
==Putting a vnc server on openmoko==&lt;br /&gt;
&lt;br /&gt;
That's another alternative :)&lt;br /&gt;
&lt;br /&gt;
==The BlackDog project==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;When plugged into the host computer’s USB port, BlackDog starts up, automatically launching the X Window system for Windows Xming and a software NAT router via an autorun application that the BlackDog presents to the host through a virtual USB CD-ROM. Once those applications are running, the virtual USB CD-ROM drive disconnects, and a virtual USB-to-Ethernet adapter is connected to provide the communications link.&lt;br /&gt;
&lt;br /&gt;
The host machine’s monitor, keyboard, mouse, and Internet connection are used by the BlackDog for the duration of the session.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The [http://en.wikipedia.org/wiki/BlackDog BlackDog server] project has lots of interesting concepts (and software).&lt;br /&gt;
&lt;br /&gt;
==Interesting distros/payloads==&lt;br /&gt;
&lt;br /&gt;
'''System diagnostics / recovery'''&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Memtest Memtest86+] Very small&lt;br /&gt;
*[http://www.ultimatebootcd.com/ The Ultimate Boot CD]&lt;br /&gt;
*[http://www.sysresccd.org/Main_Page System Rescue CD]&lt;br /&gt;
*[http://www.tux.org/pub/people/kent-robotti/looplinux/rip/ Recovery IS Possible] &amp;lt; 80 MB&lt;br /&gt;
&lt;br /&gt;
'''General purpose'''&lt;br /&gt;
*[http://jinx-linux.sourceforge.net/ jinx-linux] &amp;lt; 50 MB&lt;br /&gt;
*[http://knoppix.com/ Knoppix] 700 MB CD-ROM&lt;br /&gt;
*[http://www.puppylinux.org PuppyLinux] &amp;lt; 100 MB&lt;br /&gt;
*[http://www.damnsmalllinux.org DSL] ~50 MB&lt;br /&gt;
*[http://gentoo-wiki.com/TinyGentoo#What_is_this_.3F TinyGentoo] 5 MB&lt;br /&gt;
&lt;br /&gt;
'''Security-oriented''': pentesting, forensics, anonymous webbrowsing&lt;br /&gt;
*[http://www.darknet.org.uk/2006/03/10-best-security-live-cd-distros-pen-test-forensics-recovery/ List of Security distros]&lt;br /&gt;
*[http://www.remote-exploit.org/backtrack.html Backtrack Livecd]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Anonym.OS Anonym.OS: browse the web anonymously]&lt;br /&gt;
*[http://dban.sourceforge.net/ Darik's Boot and Nuke]: ''dangerous''&lt;br /&gt;
*[http://byzgl.sourceforge.net/wiki/index.php/Main_Page Byzantine OS] is a webkiosk appliance (32/48 MB)&lt;br /&gt;
&lt;br /&gt;
The SabayonLinux distro offers a lot of [http://www.sabayonlinux.org/wiki/index.php?title=Sabayon_Linux#Boot_Methods_for_special_ways_of_using_Sabayon boot cheatcodes], such as booting onto GeexBox. We should take a look at the method used.&lt;br /&gt;
&lt;br /&gt;
'''[http://www.livecdlist.com/ List of live distros @ livecdlist.com]''' ''Includes sizes''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/List_of_LiveDistros List of live distros @ wikipedia]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://distrowatch.com/dwres.php?resource=cd List of live distros @ distrowatch]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB article]'''&lt;br /&gt;
&lt;br /&gt;
[[Category:Ideas]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro</id>
		<title>Wishlist/LiveUSB distro</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro"/>
				<updated>2007-06-20T22:47:57Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: /* Alternative methods */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{wishlist}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
NOTE: this page may be renamed: portable destkop&lt;br /&gt;
&lt;br /&gt;
An openmoko device could act as '''the perfect geeky swiss knive''': go anywhere with your Linux desktop and tools.&lt;br /&gt;
&lt;br /&gt;
YES, there are tons of liveCDs out there, but CDs/DVDs:&lt;br /&gt;
* get easily damaged&lt;br /&gt;
* don't fit in a pocket (except for businesscard-sized ones ; too exotic...)&lt;br /&gt;
* don't update or save settings/personal data without a supplementary USB device&lt;br /&gt;
&lt;br /&gt;
YES, there are LiveUSB distros but:&lt;br /&gt;
* a Neo/OpenMoko device IS sort of an USB stick; one object is better than two&lt;br /&gt;
* i carry my cellphone everywhere, not my USB stick&lt;br /&gt;
* there is almost no security on USB sticks (nothing like cryptoloop devices, right?)&lt;br /&gt;
&lt;br /&gt;
The biggest argument against these ones is that you'd have to carry an USB cable with you... But it's a standard one, which is good news :)&lt;br /&gt;
&lt;br /&gt;
Similar functionality can be found in [http://en.wikipedia.org/wiki/Wizpy the Wizpy portable media player]&lt;br /&gt;
&lt;br /&gt;
When the openmoko device is in mass storage mode, a host computer should be able to boot on it, presenting a grub menu offering to boot into several images / partitions (payloads) on the transflash: memtest, UBCD (the ultimate boot cd), a lightweight security oriented livecd distro, you name it... &lt;br /&gt;
&lt;br /&gt;
It's sometimes called Live USB: from [http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB definition], ''A live USB is a USB flash drive containing a full operating system which can be booted from. Live USBs are closely related to Live CDs, and are sometimes used interchangeably. Like Live CDs, Live USBs can be used for system administration, data recovery, or the testing of operating system distributions without committing to a permanent installation on the local hard drive. Many of the smaller Linux distributions can also be used from a USB flash drive.''&lt;br /&gt;
&lt;br /&gt;
Usually, all you need for this with an USB storage device (flash USB stick or external drive) is a partition, flagged &amp;quot;bootable&amp;quot; (see fdisk), containing a boot loader (say grub). But the problem is that specifications vary between motherboards, so there are variants and mandatory requirements to define (here would be a good idea), so that one can optimize/maximize the compatibility.&lt;br /&gt;
&lt;br /&gt;
==The perfect geek knife==&lt;br /&gt;
&lt;br /&gt;
We may want to start our own distro with the following constraints:&lt;br /&gt;
* Multiboot: small utilities/compilations + bull blown light OS&lt;br /&gt;
* Aiming at maximum hardware compatibility, possibly using liveCD technology (knoppix-based distros)&lt;br /&gt;
* Aiming at minimum resource+system footprint, and boot speed&lt;br /&gt;
* Being able to install software temporary (for the session) or permanently, upgradable&lt;br /&gt;
* Being able to use the phone features at the same time (access pim, data &amp;amp; calls)&lt;br /&gt;
&lt;br /&gt;
Optimally, being able to charge the device while plugged in would be great too.&lt;br /&gt;
&lt;br /&gt;
==About USB Booting==&lt;br /&gt;
&lt;br /&gt;
From [http://www.damnsmalllinux.org/wiki/index.php/USB_Booting DSL Wiki]:&lt;br /&gt;
&lt;br /&gt;
Older computer BIOS usually do not support direct booting from a USB device. Around 2001, PC motherboard manufacturers started to add USB boot support.&lt;br /&gt;
&lt;br /&gt;
There are two common BIOS methods for direct USB booting:&lt;br /&gt;
* One method is called the &amp;quot;USBHDD&amp;quot; method and it is used to support the booting of standard USB mass storage devices that are configured like a normal PC hard drive.&lt;br /&gt;
* The other method is called the &amp;quot;USBZIP&amp;quot; method and it supports booting from a USB storage device that behaves like the original IOMEGA ZIP drive with USB support. &lt;br /&gt;
&lt;br /&gt;
Most computers (just about all Dells, for example) made today have a BIOS that supports the USBHDD method so I expect that this will eventually become the standard way to boot a USB device. However, many motherboards will support BOTH methods, and many older motherboards have USBZIP support.&lt;br /&gt;
&lt;br /&gt;
Some newer BIOSs which support USB 2.0 will not boot from an older pen drive. Using a USB 2.0 compliant one usually solves this problem. Also, some older BIOSs which only support USB 1.1 will not boot from newer drives which support USB 2.0!&lt;br /&gt;
&lt;br /&gt;
Some USB keys don't boot. If this is the case, it may be possible to fix them by installing a new master boot record. (Most keys boot OK by default; some cannot be fixed even by doing this. However, it helps in some cases). Run the command:&lt;br /&gt;
&lt;br /&gt;
  lilo -M /dev/sda&lt;br /&gt;
&lt;br /&gt;
==USB Booting in Neo1973's kernel==&lt;br /&gt;
&lt;br /&gt;
Although there is very little information about it, the g_storage kernel module is responsible for the Neo's mass storage mode. So the boot-or-not criteria might rely on this very module.&lt;br /&gt;
&lt;br /&gt;
==TODO==&lt;br /&gt;
&lt;br /&gt;
Testing/further research has to be conducted to determine:&lt;br /&gt;
* if a bootable-flagged partition / grub doesn't mess openmoko up&lt;br /&gt;
* if the phone can still act as a phone, or if the booted os can use the gprs functions&lt;br /&gt;
* if the phone can recharge on mass storage mode (from the usb cable)&lt;br /&gt;
* if a dedicated partition for each payload is needed (see memtest example...)&lt;br /&gt;
* if multi-boot is possible: grub?&lt;br /&gt;
&lt;br /&gt;
==Linux distro Howto's: liveUSB creation==&lt;br /&gt;
&lt;br /&gt;
In short:&lt;br /&gt;
#Mount USB drive, with e.g. mount /dev/sda1 /flash - can be either FAT16 or FAT32!&lt;br /&gt;
#Mount ISO image, with e.g. mount /tmp/dsl-3.2.iso /tmp/iso -o loop&lt;br /&gt;
#Copy all contents from ISO to USB drive: cp -vr /tmp/iso/* /flash/&lt;br /&gt;
#Rename and move syslinux files to root directory: mv /flash/boot/isolinux/* /flash/&lt;br /&gt;
#Rename isolinux.cfg: mv /flash/isolinux.cfg /flash/syslinux.cfg&lt;br /&gt;
#Unmount USB drive: umount /flash&lt;br /&gt;
#Install syslinux: syslinux /dev/sda1 and eventually set the MBR boot flag for this partition (with fdisk). &lt;br /&gt;
&lt;br /&gt;
*Fedora Core's [http://revisor.fedoraunity.org Revisor] enables easy GUI-driven ISO customization, allowing to choose the output medium (CD/DVD/USB)&lt;br /&gt;
*[http://www.damnsmalllinux.org/wiki/index.php/Installing_to_a_USB_Flash_Drive Installing DSL to USB device - using grub]&lt;br /&gt;
*[http://wiki.debian.org/BootUsb Debian BootUSB - using Lilo]&lt;br /&gt;
*[http://www.debuntu.org/how-to-install-ubuntu-linux-on-usb-bar Howto install ubuntu (or any other distro) on usb stick]&lt;br /&gt;
*[http://www.gentoo.org/doc/en/liveusb.xml Gentoo on usb stick]&lt;br /&gt;
*[http://pendrivelinux.com/ Windows &amp;amp; Linux tutorials &amp;amp; resources]:     &lt;br /&gt;
    * Flash installation via Windows: XUbuntu, DSL, Knoppix, Slax, MiniMe&lt;br /&gt;
    * Flash installation via Linux: Ubuntu Edgy, Knoppix, PCLinuxOS&lt;br /&gt;
&lt;br /&gt;
'''Transflash partitioning schema example'''&lt;br /&gt;
&lt;br /&gt;
* 2 Gb: /dev/sd? (where N is the transflash's number)&lt;br /&gt;
* 700 Mb: /dev/sd?1 : containing bootable iso, FAT16&lt;br /&gt;
* 1300 Mb: /dev/sd?2 : openmoko &amp;amp; bootable os home partition, EXT3?&lt;br /&gt;
* + eventually a swap&lt;br /&gt;
&lt;br /&gt;
The limitation of this method is that the booted OS is static (not-self modifiable). There's the option to install linux using the partition, but it's not really mobility-oriented (liveCDs are optimized for maximum autoconfiguration).&lt;br /&gt;
&lt;br /&gt;
==Alternative methods==&lt;br /&gt;
&lt;br /&gt;
===Booting ISOs ?===&lt;br /&gt;
&lt;br /&gt;
* Grub? From [http://www.freesoftwaremagazine.com/articles/grub_intro#comment-12900 How to install grub on an usb pendrive]:&lt;br /&gt;
    If you want to boot from a iso file on a harddisk, do something in menu.lst like&lt;br /&gt;
    title Boot from iso on a harddisk&lt;br /&gt;
    map (hdX,Y)/your.iso (hdZ)&lt;br /&gt;
    map --rehook&lt;br /&gt;
    chainloader (hdZ)+1&lt;br /&gt;
    rootnoverify (hdZ)&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
Grub &amp;amp; memdisk can boot floppy images, but (AFAIK) not isos. Example from the stock /boot/grub/menu.lst ubuntu:&lt;br /&gt;
    title           Ubuntu, memtest86+&lt;br /&gt;
    root            (hd0,2)&lt;br /&gt;
    kernel          /memtest86+.bin&lt;br /&gt;
    quiet&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
''Using the memdisk kernel from the syslinux package, you can load disk images and execute them in a non-emulated environment.''&lt;br /&gt;
&lt;br /&gt;
* [http://www.knoppix.net/wiki/Cheat_Codes knoppix '''bootfrom''' cheatcode]&lt;br /&gt;
&lt;br /&gt;
    bootfrom=/dev/hda1/KNX.iso &lt;br /&gt;
&lt;br /&gt;
Bootfrom needs access to a running Knoppix-System '''with the same Kernel as the Bootkernel''', before it is able to mount the partition / ISO-Image.  &lt;br /&gt;
&lt;br /&gt;
* Maybe there's a way to achieve a boot cd iso selecter see ([http://www.linuxquestions.org/questions/showthread.php?t=528840 this post])&lt;br /&gt;
* virtualization-oriented distro... ex [http://unit.aist.go.jp/itri/knoppix/xen/index-en.html Xenoppix] Cons: would work best only on modern VT-capable computers. What about a very minimal distribution (say DSL without X) kqemu-enblaed, booting into an ncurses iso-loader? The delicate part would be on the networking side.&lt;br /&gt;
&lt;br /&gt;
==Zero-Install systems==&lt;br /&gt;
&lt;br /&gt;
For limited storage devices (such as a transflash device), zero-install systems can be very interesting: you can download and run software, without installing it.&lt;br /&gt;
&lt;br /&gt;
The most interesting projects so far seem to be:&lt;br /&gt;
*[http://klik.atekon.de/wiki/index.php/Main_Page Klik] with more than 1000 packages ported. See [http://klik.atekon.de/wiki/index.php/Comparison comparison chart].&lt;br /&gt;
*[http://0install.net/index.html The Zero Install System], with automatic dependancies, upgrading. See [http://0install.net/matrix.html] comparison chart.&lt;br /&gt;
*Why not rolling a [http://wiki.rpath.com/wiki/Conary:Concepts Conary/RPath-based] distro, based on [http://www.rpath.com/rbuilder/project/rpath/ rPath linux] reference distribution ? Or choose within the available ones...&lt;br /&gt;
* The FUSE [http://httpfs.sourceforge.net/net_boot.htm httpfs] may allow pure http net booting, downloading files from a distant livecd only when needed (this image may be very minimal though).&lt;br /&gt;
&lt;br /&gt;
One may choose/begin a zero-install-enabled distro for minimal footprint.&lt;br /&gt;
&lt;br /&gt;
==Using Qemu to boot Linux from a flash drive within Windows==&lt;br /&gt;
&lt;br /&gt;
The following tutorial explains how to use Qemu to boot Linux from a portable USB flash device while still working within Windows. This Enables the user to have both systems running at the same time eliminating the need to restart the PC and set your BIOS options to boot Linux.&lt;br /&gt;
&lt;br /&gt;
[http://www.pendrivelinux.com/2007/03/09/use-qemu-to-boot-linux-from-windows/ PendriveLinux article]&lt;br /&gt;
&lt;br /&gt;
==Putting a vnc server on openmoko==&lt;br /&gt;
&lt;br /&gt;
That's another alternative :)&lt;br /&gt;
&lt;br /&gt;
==The BlackDog project==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;When plugged into the host computer’s USB port, BlackDog starts up, automatically launching the X Window system for Windows Xming and a software NAT router via an autorun application that the BlackDog presents to the host through a virtual USB CD-ROM. Once those applications are running, the virtual USB CD-ROM drive disconnects, and a virtual USB-to-Ethernet adapter is connected to provide the communications link.&lt;br /&gt;
&lt;br /&gt;
The host machine’s monitor, keyboard, mouse, and Internet connection are used by the BlackDog for the duration of the session.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The [http://en.wikipedia.org/wiki/BlackDog BlackDog server] project has lots of interesting concepts (and software).&lt;br /&gt;
&lt;br /&gt;
==Interesting distros/payloads==&lt;br /&gt;
&lt;br /&gt;
'''System diagnostics / recovery'''&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Memtest Memtest86+] Very small&lt;br /&gt;
*[http://www.ultimatebootcd.com/ The Ultimate Boot CD]&lt;br /&gt;
*[http://www.sysresccd.org/Main_Page System Rescue CD]&lt;br /&gt;
*[http://www.tux.org/pub/people/kent-robotti/looplinux/rip/ Recovery IS Possible] &amp;lt; 80 MB&lt;br /&gt;
&lt;br /&gt;
'''General purpose'''&lt;br /&gt;
*[http://jinx-linux.sourceforge.net/ jinx-linux] &amp;lt; 50 MB&lt;br /&gt;
*[http://knoppix.com/ Knoppix] 700 MB CD-ROM&lt;br /&gt;
*[http://www.puppylinux.org PuppyLinux] &amp;lt; 100 MB&lt;br /&gt;
*[http://www.damnsmalllinux.org DSL] ~50 MB&lt;br /&gt;
*[http://gentoo-wiki.com/TinyGentoo#What_is_this_.3F TinyGentoo] 5 MB&lt;br /&gt;
&lt;br /&gt;
'''Security-oriented''': pentesting, forensics, anonymous webbrowsing&lt;br /&gt;
*[http://www.darknet.org.uk/2006/03/10-best-security-live-cd-distros-pen-test-forensics-recovery/ List of Security distros]&lt;br /&gt;
*[http://www.remote-exploit.org/backtrack.html Backtrack Livecd]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Anonym.OS Anonym.OS: browse the web anonymously]&lt;br /&gt;
*[http://dban.sourceforge.net/ Darik's Boot and Nuke]: ''dangerous''&lt;br /&gt;
*[http://byzgl.sourceforge.net/wiki/index.php/Main_Page Byzantine OS] is a webkiosk appliance (32/48 MB)&lt;br /&gt;
&lt;br /&gt;
The SabayonLinux distro offers a lot of [http://www.sabayonlinux.org/wiki/index.php?title=Sabayon_Linux#Boot_Methods_for_special_ways_of_using_Sabayon boot cheatcodes], such as booting onto GeexBox. We should take a look at the method used.&lt;br /&gt;
&lt;br /&gt;
'''[http://www.livecdlist.com/ List of live distros @ livecdlist.com]''' ''Includes sizes''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/List_of_LiveDistros List of live distros @ wikipedia]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://distrowatch.com/dwres.php?resource=cd List of live distros @ distrowatch]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB article]'''&lt;br /&gt;
&lt;br /&gt;
[[Category:Ideas]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro</id>
		<title>Wishlist/LiveUSB distro</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Wishlist/LiveUSB_distro"/>
				<updated>2007-06-20T22:45:41Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: Project BlackDog addition&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{wishlist}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
NOTE: this page may be renamed: portable destkop&lt;br /&gt;
&lt;br /&gt;
An openmoko device could act as '''the perfect geeky swiss knive''': go anywhere with your Linux desktop and tools.&lt;br /&gt;
&lt;br /&gt;
YES, there are tons of liveCDs out there, but CDs/DVDs:&lt;br /&gt;
* get easily damaged&lt;br /&gt;
* don't fit in a pocket (except for businesscard-sized ones ; too exotic...)&lt;br /&gt;
* don't update or save settings/personal data without a supplementary USB device&lt;br /&gt;
&lt;br /&gt;
YES, there are LiveUSB distros but:&lt;br /&gt;
* a Neo/OpenMoko device IS sort of an USB stick; one object is better than two&lt;br /&gt;
* i carry my cellphone everywhere, not my USB stick&lt;br /&gt;
* there is almost no security on USB sticks (nothing like cryptoloop devices, right?)&lt;br /&gt;
&lt;br /&gt;
The biggest argument against these ones is that you'd have to carry an USB cable with you... But it's a standard one, which is good news :)&lt;br /&gt;
&lt;br /&gt;
Similar functionality can be found in [http://en.wikipedia.org/wiki/Wizpy the Wizpy portable media player]&lt;br /&gt;
&lt;br /&gt;
When the openmoko device is in mass storage mode, a host computer should be able to boot on it, presenting a grub menu offering to boot into several images / partitions (payloads) on the transflash: memtest, UBCD (the ultimate boot cd), a lightweight security oriented livecd distro, you name it... &lt;br /&gt;
&lt;br /&gt;
It's sometimes called Live USB: from [http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB definition], ''A live USB is a USB flash drive containing a full operating system which can be booted from. Live USBs are closely related to Live CDs, and are sometimes used interchangeably. Like Live CDs, Live USBs can be used for system administration, data recovery, or the testing of operating system distributions without committing to a permanent installation on the local hard drive. Many of the smaller Linux distributions can also be used from a USB flash drive.''&lt;br /&gt;
&lt;br /&gt;
Usually, all you need for this with an USB storage device (flash USB stick or external drive) is a partition, flagged &amp;quot;bootable&amp;quot; (see fdisk), containing a boot loader (say grub). But the problem is that specifications vary between motherboards, so there are variants and mandatory requirements to define (here would be a good idea), so that one can optimize/maximize the compatibility.&lt;br /&gt;
&lt;br /&gt;
==The perfect geek knife==&lt;br /&gt;
&lt;br /&gt;
We may want to start our own distro with the following constraints:&lt;br /&gt;
* Multiboot: small utilities/compilations + bull blown light OS&lt;br /&gt;
* Aiming at maximum hardware compatibility, possibly using liveCD technology (knoppix-based distros)&lt;br /&gt;
* Aiming at minimum resource+system footprint, and boot speed&lt;br /&gt;
* Being able to install software temporary (for the session) or permanently, upgradable&lt;br /&gt;
* Being able to use the phone features at the same time (access pim, data &amp;amp; calls)&lt;br /&gt;
&lt;br /&gt;
Optimally, being able to charge the device while plugged in would be great too.&lt;br /&gt;
&lt;br /&gt;
==About USB Booting==&lt;br /&gt;
&lt;br /&gt;
From [http://www.damnsmalllinux.org/wiki/index.php/USB_Booting DSL Wiki]:&lt;br /&gt;
&lt;br /&gt;
Older computer BIOS usually do not support direct booting from a USB device. Around 2001, PC motherboard manufacturers started to add USB boot support.&lt;br /&gt;
&lt;br /&gt;
There are two common BIOS methods for direct USB booting:&lt;br /&gt;
* One method is called the &amp;quot;USBHDD&amp;quot; method and it is used to support the booting of standard USB mass storage devices that are configured like a normal PC hard drive.&lt;br /&gt;
* The other method is called the &amp;quot;USBZIP&amp;quot; method and it supports booting from a USB storage device that behaves like the original IOMEGA ZIP drive with USB support. &lt;br /&gt;
&lt;br /&gt;
Most computers (just about all Dells, for example) made today have a BIOS that supports the USBHDD method so I expect that this will eventually become the standard way to boot a USB device. However, many motherboards will support BOTH methods, and many older motherboards have USBZIP support.&lt;br /&gt;
&lt;br /&gt;
Some newer BIOSs which support USB 2.0 will not boot from an older pen drive. Using a USB 2.0 compliant one usually solves this problem. Also, some older BIOSs which only support USB 1.1 will not boot from newer drives which support USB 2.0!&lt;br /&gt;
&lt;br /&gt;
Some USB keys don't boot. If this is the case, it may be possible to fix them by installing a new master boot record. (Most keys boot OK by default; some cannot be fixed even by doing this. However, it helps in some cases). Run the command:&lt;br /&gt;
&lt;br /&gt;
  lilo -M /dev/sda&lt;br /&gt;
&lt;br /&gt;
==USB Booting in Neo1973's kernel==&lt;br /&gt;
&lt;br /&gt;
Although there is very little information about it, the g_storage kernel module is responsible for the Neo's mass storage mode. So the boot-or-not criteria might rely on this very module.&lt;br /&gt;
&lt;br /&gt;
==TODO==&lt;br /&gt;
&lt;br /&gt;
Testing/further research has to be conducted to determine:&lt;br /&gt;
* if a bootable-flagged partition / grub doesn't mess openmoko up&lt;br /&gt;
* if the phone can still act as a phone, or if the booted os can use the gprs functions&lt;br /&gt;
* if the phone can recharge on mass storage mode (from the usb cable)&lt;br /&gt;
* if a dedicated partition for each payload is needed (see memtest example...)&lt;br /&gt;
* if multi-boot is possible: grub?&lt;br /&gt;
&lt;br /&gt;
==Linux distro Howto's: liveUSB creation==&lt;br /&gt;
&lt;br /&gt;
In short:&lt;br /&gt;
#Mount USB drive, with e.g. mount /dev/sda1 /flash - can be either FAT16 or FAT32!&lt;br /&gt;
#Mount ISO image, with e.g. mount /tmp/dsl-3.2.iso /tmp/iso -o loop&lt;br /&gt;
#Copy all contents from ISO to USB drive: cp -vr /tmp/iso/* /flash/&lt;br /&gt;
#Rename and move syslinux files to root directory: mv /flash/boot/isolinux/* /flash/&lt;br /&gt;
#Rename isolinux.cfg: mv /flash/isolinux.cfg /flash/syslinux.cfg&lt;br /&gt;
#Unmount USB drive: umount /flash&lt;br /&gt;
#Install syslinux: syslinux /dev/sda1 and eventually set the MBR boot flag for this partition (with fdisk). &lt;br /&gt;
&lt;br /&gt;
*Fedora Core's [http://revisor.fedoraunity.org Revisor] enables easy GUI-driven ISO customization, allowing to choose the output medium (CD/DVD/USB)&lt;br /&gt;
*[http://www.damnsmalllinux.org/wiki/index.php/Installing_to_a_USB_Flash_Drive Installing DSL to USB device - using grub]&lt;br /&gt;
*[http://wiki.debian.org/BootUsb Debian BootUSB - using Lilo]&lt;br /&gt;
*[http://www.debuntu.org/how-to-install-ubuntu-linux-on-usb-bar Howto install ubuntu (or any other distro) on usb stick]&lt;br /&gt;
*[http://www.gentoo.org/doc/en/liveusb.xml Gentoo on usb stick]&lt;br /&gt;
*[http://pendrivelinux.com/ Windows &amp;amp; Linux tutorials &amp;amp; resources]:     &lt;br /&gt;
    * Flash installation via Windows: XUbuntu, DSL, Knoppix, Slax, MiniMe&lt;br /&gt;
    * Flash installation via Linux: Ubuntu Edgy, Knoppix, PCLinuxOS&lt;br /&gt;
&lt;br /&gt;
'''Transflash partitioning schema example'''&lt;br /&gt;
&lt;br /&gt;
* 2 Gb: /dev/sd? (where N is the transflash's number)&lt;br /&gt;
* 700 Mb: /dev/sd?1 : containing bootable iso, FAT16&lt;br /&gt;
* 1300 Mb: /dev/sd?2 : openmoko &amp;amp; bootable os home partition, EXT3?&lt;br /&gt;
* + eventually a swap&lt;br /&gt;
&lt;br /&gt;
The limitation of this method is that the booted OS is static (not-self modifiable). There's the option to install linux using the partition, but it's not really mobility-oriented (liveCDs are optimized for maximum autoconfiguration).&lt;br /&gt;
&lt;br /&gt;
==Alternative methods==&lt;br /&gt;
&lt;br /&gt;
The ideal way of doing it would be to have a bootloader on the usb flash, which would offer booting directly from an iso (stored on the very same device). This way, just download the new iso, and it's updated !&lt;br /&gt;
&lt;br /&gt;
Hints to explore:&lt;br /&gt;
* [http://www.911cd.net/forums//index.php?showtopic=8955&amp;amp;hl= Isoemu] ''By using it, we can boot our system from a local iso file, if this iso file is bootable'' (well, i'd like to see that :p)&lt;br /&gt;
* Grub? From [http://www.freesoftwaremagazine.com/articles/grub_intro#comment-12900 How to install grub on an usb pendrive]:&lt;br /&gt;
    If you want to boot from a iso file on a harddisk, do something in menu.lst like&lt;br /&gt;
    title Boot from iso on a harddisk&lt;br /&gt;
    map (hdX,Y)/your.iso (hdZ)&lt;br /&gt;
    map --rehook&lt;br /&gt;
    chainloader (hdZ)+1&lt;br /&gt;
    rootnoverify (hdZ)&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
Grub &amp;amp; memdisk can boot floppy images, but (AFAIK) not isos. Example from the stock /boot/grub/menu.lst ubuntu:&lt;br /&gt;
    title           Ubuntu, memtest86+&lt;br /&gt;
    root            (hd0,2)&lt;br /&gt;
    kernel          /memtest86+.bin&lt;br /&gt;
    quiet&lt;br /&gt;
    boot&lt;br /&gt;
&lt;br /&gt;
''Using the memdisk kernel from the syslinux package, you can load disk images and execute them in a non-emulated environment.''&lt;br /&gt;
&lt;br /&gt;
* [http://www.knoppix.net/wiki/Cheat_Codes knoppix '''bootfrom''' cheatcode]&lt;br /&gt;
&lt;br /&gt;
    bootfrom=/dev/hda1/KNX.iso &lt;br /&gt;
&lt;br /&gt;
Bootfrom needs access to a running Knoppix-System '''with the same Kernel as the Bootkernel''', before it is able to mount the partition / ISO-Image.  &lt;br /&gt;
&lt;br /&gt;
* Maybe there's a way to achieve a boot cd iso selecter see ([http://www.linuxquestions.org/questions/showthread.php?t=528840 this post])&lt;br /&gt;
* virtualization-oriented distro... ex [http://unit.aist.go.jp/itri/knoppix/xen/index-en.html Xenoppix] Cons: would work best only on modern VT-capable computers. What about a very minimal distribution (say DSL without X) kqemu-enblaed, booting into an ncurses iso-loader? The delicate part would be on the networking side.&lt;br /&gt;
&lt;br /&gt;
==Zero-Install systems==&lt;br /&gt;
&lt;br /&gt;
For limited storage devices (such as a transflash device), zero-install systems can be very interesting: you can download and run software, without installing it.&lt;br /&gt;
&lt;br /&gt;
The most interesting projects so far seem to be:&lt;br /&gt;
*[http://klik.atekon.de/wiki/index.php/Main_Page Klik] with more than 1000 packages ported. See [http://klik.atekon.de/wiki/index.php/Comparison comparison chart].&lt;br /&gt;
*[http://0install.net/index.html The Zero Install System], with automatic dependancies, upgrading. See [http://0install.net/matrix.html] comparison chart.&lt;br /&gt;
*Why not rolling a [http://wiki.rpath.com/wiki/Conary:Concepts Conary/RPath-based] distro, based on [http://www.rpath.com/rbuilder/project/rpath/ rPath linux] reference distribution ? Or choose within the available ones...&lt;br /&gt;
* The FUSE [http://httpfs.sourceforge.net/net_boot.htm httpfs] may allow pure http net booting, downloading files from a distant livecd only when needed (this image may be very minimal though).&lt;br /&gt;
&lt;br /&gt;
One may choose/begin a zero-install-enabled distro for minimal footprint.&lt;br /&gt;
&lt;br /&gt;
==Using Qemu to boot Linux from a flash drive within Windows==&lt;br /&gt;
&lt;br /&gt;
The following tutorial explains how to use Qemu to boot Linux from a portable USB flash device while still working within Windows. This Enables the user to have both systems running at the same time eliminating the need to restart the PC and set your BIOS options to boot Linux.&lt;br /&gt;
&lt;br /&gt;
[http://www.pendrivelinux.com/2007/03/09/use-qemu-to-boot-linux-from-windows/ PendriveLinux article]&lt;br /&gt;
&lt;br /&gt;
==Putting a vnc server on openmoko==&lt;br /&gt;
&lt;br /&gt;
That's another alternative :)&lt;br /&gt;
&lt;br /&gt;
==The BlackDog project==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;When plugged into the host computer’s USB port, BlackDog starts up, automatically launching the X Window system for Windows Xming and a software NAT router via an autorun application that the BlackDog presents to the host through a virtual USB CD-ROM. Once those applications are running, the virtual USB CD-ROM drive disconnects, and a virtual USB-to-Ethernet adapter is connected to provide the communications link.&lt;br /&gt;
&lt;br /&gt;
The host machine’s monitor, keyboard, mouse, and Internet connection are used by the BlackDog for the duration of the session.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The [http://en.wikipedia.org/wiki/BlackDog BlackDog server] project has lots of interesting concepts (and software).&lt;br /&gt;
&lt;br /&gt;
==Interesting distros/payloads==&lt;br /&gt;
&lt;br /&gt;
'''System diagnostics / recovery'''&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Memtest Memtest86+] Very small&lt;br /&gt;
*[http://www.ultimatebootcd.com/ The Ultimate Boot CD]&lt;br /&gt;
*[http://www.sysresccd.org/Main_Page System Rescue CD]&lt;br /&gt;
*[http://www.tux.org/pub/people/kent-robotti/looplinux/rip/ Recovery IS Possible] &amp;lt; 80 MB&lt;br /&gt;
&lt;br /&gt;
'''General purpose'''&lt;br /&gt;
*[http://jinx-linux.sourceforge.net/ jinx-linux] &amp;lt; 50 MB&lt;br /&gt;
*[http://knoppix.com/ Knoppix] 700 MB CD-ROM&lt;br /&gt;
*[http://www.puppylinux.org PuppyLinux] &amp;lt; 100 MB&lt;br /&gt;
*[http://www.damnsmalllinux.org DSL] ~50 MB&lt;br /&gt;
*[http://gentoo-wiki.com/TinyGentoo#What_is_this_.3F TinyGentoo] 5 MB&lt;br /&gt;
&lt;br /&gt;
'''Security-oriented''': pentesting, forensics, anonymous webbrowsing&lt;br /&gt;
*[http://www.darknet.org.uk/2006/03/10-best-security-live-cd-distros-pen-test-forensics-recovery/ List of Security distros]&lt;br /&gt;
*[http://www.remote-exploit.org/backtrack.html Backtrack Livecd]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Anonym.OS Anonym.OS: browse the web anonymously]&lt;br /&gt;
*[http://dban.sourceforge.net/ Darik's Boot and Nuke]: ''dangerous''&lt;br /&gt;
*[http://byzgl.sourceforge.net/wiki/index.php/Main_Page Byzantine OS] is a webkiosk appliance (32/48 MB)&lt;br /&gt;
&lt;br /&gt;
The SabayonLinux distro offers a lot of [http://www.sabayonlinux.org/wiki/index.php?title=Sabayon_Linux#Boot_Methods_for_special_ways_of_using_Sabayon boot cheatcodes], such as booting onto GeexBox. We should take a look at the method used.&lt;br /&gt;
&lt;br /&gt;
'''[http://www.livecdlist.com/ List of live distros @ livecdlist.com]''' ''Includes sizes''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/List_of_LiveDistros List of live distros @ wikipedia]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://distrowatch.com/dwres.php?resource=cd List of live distros @ distrowatch]'''&lt;br /&gt;
&lt;br /&gt;
'''[http://en.wikipedia.org/wiki/Live_USB Wikipedia LiveUSB article]'''&lt;br /&gt;
&lt;br /&gt;
[[Category:Ideas]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Wishlist/Text_Input</id>
		<title>Wishlist/Text Input</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Wishlist/Text_Input"/>
				<updated>2007-06-15T09:53:14Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: Added blog post to smartpen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Current version supports input using [[Input Method|on screen keyboard]].&lt;br /&gt;
You can also use Bluetooth keyboards and with (battery) powered USB hub can also use USB keyboards.&lt;br /&gt;
&lt;br /&gt;
Near computer can also use networking over Bluetooth or USB and then ssh into device or run X11 programs remotely and thus use whatever input possibilities other computer supports.&lt;br /&gt;
&lt;br /&gt;
For further predictive text input information see: [http://en.wikipedia.org/wiki/Predictive_text Predictive text wikipedia]&lt;br /&gt;
&lt;br /&gt;
{{Wishlist}}&lt;br /&gt;
[[Category:User Interfaces]]&lt;br /&gt;
&lt;br /&gt;
===== New input methods =====&lt;br /&gt;
* [http://patrickbaudisch.com/publications/2007-Vogel-CHI07-Shift.pdf Shift]&lt;br /&gt;
* [http://www.inf.ufsc.br/~guy/text_input.html Another text input]&lt;br /&gt;
* [http://www.inference.phy.cam.ac.uk/dasher/ Dasher] ([http://en.wikipedia.org/wiki/Dasher Wikipedia link]): A side-scrolling probabalistic text entry method that's well suited to stylus use. One disadvantage is that it makes little use of muscle memory so you need to pay close attention to the screen while entering text. An andvatage is that it is not limeted to english text, but can be used with any language/alphabet. A video presentation is also [http://video.google.com/videoplay?docid=5078334075080674416 available]&lt;br /&gt;
* [http://www.micropp.se/openmoko/ Finger splash] (Idea presented on [http://lists.openmoko.org/pipermail/community/2007-March/003984.html OpenMoko community mailing list])&lt;br /&gt;
* [http://www.strout.net/info/ideas/hexinput.html HexInput]: A keyboard-style input method optimized for stylus use.&lt;br /&gt;
* [http://www.exideas.com/ME/faq.html MessagEaseST] ([http://www.youtube.com/watch?v=zFf9Mw3nlsY YouTube demo])&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Morse_code Morse Code]&lt;br /&gt;
* [http://mrl.nyu.edu/projects/quikwriting/ Quikwriting]&lt;br /&gt;
* [http://www.almaden.ibm.com/u/zhai/shapewriter.htm Shape Writing]&lt;br /&gt;
* [http://lists.openmoko.org/pipermail/openmoko-devel/2007-May/000912.html Werner Almesberger's finger input suggestion] ([http://www.acc.umu.se/~cm/inw.pdf Draft layout as pdf] [http://www.almesberger.net/misc/openmoko/inwheel-1.tar.gz Prototype])&lt;br /&gt;
* [http://www.hellkvist.org/software/ XMerlin]&lt;br /&gt;
&lt;br /&gt;
===== Patented input methods =====&lt;br /&gt;
* [http://depts.washington.edu/ewrite/ EdgeWrite], a unistroke character/word input method (reminiscent of Palm's Graffiti)&lt;br /&gt;
* [http://www.fitaly.com/wince/pocketpcfitaly.htm Fitaly Keyboard]&lt;br /&gt;
* [http://images.overstock.com/f/102/3117/8h/www.overstock.com/images/products/L10480944.jpg Input method used by Garmin] (Maybe patented?)&lt;br /&gt;
* [http://www.speedscript.biz/ SpeedScript]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/T9_%28predictive_text%29 T9] See http://www.tegic.com/about/patent-list.asp for legally addability for users in some countries. &lt;br /&gt;
* [http://www.tengo.net/ TenGO]&lt;br /&gt;
* [http://www.agiletext.com/ AgileText]&lt;br /&gt;
&lt;br /&gt;
===== Text input method surveys =====&lt;br /&gt;
&lt;br /&gt;
Here are some surveys / overviews of text entry methods that I turned up using Google:&lt;br /&gt;
* [http://www.dcs.gla.ac.uk/~jhw/text.html Text entry] A web page with a survey of text entry methods by John Williamson&lt;br /&gt;
* Poika Isokoski, [http://www.cs.uta.fi/~poika/g/g.html A Minimal Device-Independent Text Input Method], has a chapter listing existing approaches ca. 1999&lt;br /&gt;
&lt;br /&gt;
===== Other ways to enter text =====&lt;br /&gt;
* Once there is hardware with multi-touch screen support, [[Wishlist:Spell weaving|gesturing with 2-3 fingers]] might offer interesting possibilities.&lt;br /&gt;
* Use [[VoiceText|voice to dictate text]]&lt;br /&gt;
* Use [[Optical Character Recognition]] and [[Barcode Recognition]] on an image that exists on the file system or via a picture that has just been taken (even if it is a temporary picture only for this purpose).&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Speedwords Dutton Speedwords]&lt;br /&gt;
&lt;br /&gt;
===== Interesting hardware input devices =====&lt;br /&gt;
* [http://www.mobilitysite.com/2007/02/small_compact_bluetooth_keyboard.php Credit-card sized bluetooth keyboard] (Note: apparently supports only Bluetooth Serial Port Profile and not HID; supportable, of course, perhaps using existing user space daemon [http://handhelds.org/moin/moin.cgi/kbdd kbdd])&lt;br /&gt;
* [http://www.thinkgeek.com/computing/input/8193/ Bluetooth laser virtual keyboard] eventually could be built into the phone once more miniaturized.&lt;br /&gt;
* [http://www.thinkgeek.com/computing/input/6c82/ Frogpad]&lt;br /&gt;
* [http://www.spartechnik.de/start.htm?d_Keyb_Mini_Mini_Bluetooth_Keyboard_im_Scheckkartenformat.htm Freedom Mini], apparently not manufactured anymore but still sold and works out of the box with Bluez' hidd. Has a spring-loaded hinge for squeezing a phone/PDA against the keyboard; seems like a Neo could attach nicely but don't have one to actually test. --[[User:Mjr|Mjr]] 10:30, 15 May 2007 (CEST)&lt;br /&gt;
* [http://www.3pointd.com/20070518/finger-mounted-3d-mouse-from-undergrads/ experimental ring-mouse]&lt;br /&gt;
* Livescribe's [http://www.livescribe.com/sneakpeek/index.html smartpen]; could act as touchscreen pen + laser + regular pen + &amp;quot;intelligent&amp;quot; pen + OCR device. See [http://www.pikesoft.com/blog/index.php?itemid=189 this] blog post.&lt;br /&gt;
&lt;br /&gt;
[[Category:Ideas]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	<entry>
		<id>http://wiki.openmoko.org/wiki/Wishlist/Text_Input</id>
		<title>Wishlist/Text Input</title>
		<link rel="alternate" type="text/html" href="http://wiki.openmoko.org/wiki/Wishlist/Text_Input"/>
				<updated>2007-06-15T09:48:04Z</updated>
		
		<summary type="html">&lt;p&gt;Fthiery: Added livescribe pen link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Current version supports input using [[Input Method|on screen keyboard]].&lt;br /&gt;
You can also use Bluetooth keyboards and with (battery) powered USB hub can also use USB keyboards.&lt;br /&gt;
&lt;br /&gt;
Near computer can also use networking over Bluetooth or USB and then ssh into device or run X11 programs remotely and thus use whatever input possibilities other computer supports.&lt;br /&gt;
&lt;br /&gt;
For further predictive text input information see: [http://en.wikipedia.org/wiki/Predictive_text Predictive text wikipedia]&lt;br /&gt;
&lt;br /&gt;
{{Wishlist}}&lt;br /&gt;
[[Category:User Interfaces]]&lt;br /&gt;
&lt;br /&gt;
===== New input methods =====&lt;br /&gt;
* [http://patrickbaudisch.com/publications/2007-Vogel-CHI07-Shift.pdf Shift]&lt;br /&gt;
* [http://www.inf.ufsc.br/~guy/text_input.html Another text input]&lt;br /&gt;
* [http://www.inference.phy.cam.ac.uk/dasher/ Dasher] ([http://en.wikipedia.org/wiki/Dasher Wikipedia link]): A side-scrolling probabalistic text entry method that's well suited to stylus use. One disadvantage is that it makes little use of muscle memory so you need to pay close attention to the screen while entering text. An andvatage is that it is not limeted to english text, but can be used with any language/alphabet. A video presentation is also [http://video.google.com/videoplay?docid=5078334075080674416 available]&lt;br /&gt;
* [http://www.micropp.se/openmoko/ Finger splash] (Idea presented on [http://lists.openmoko.org/pipermail/community/2007-March/003984.html OpenMoko community mailing list])&lt;br /&gt;
* [http://www.strout.net/info/ideas/hexinput.html HexInput]: A keyboard-style input method optimized for stylus use.&lt;br /&gt;
* [http://www.exideas.com/ME/faq.html MessagEaseST] ([http://www.youtube.com/watch?v=zFf9Mw3nlsY YouTube demo])&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Morse_code Morse Code]&lt;br /&gt;
* [http://mrl.nyu.edu/projects/quikwriting/ Quikwriting]&lt;br /&gt;
* [http://www.almaden.ibm.com/u/zhai/shapewriter.htm Shape Writing]&lt;br /&gt;
* [http://lists.openmoko.org/pipermail/openmoko-devel/2007-May/000912.html Werner Almesberger's finger input suggestion] ([http://www.acc.umu.se/~cm/inw.pdf Draft layout as pdf] [http://www.almesberger.net/misc/openmoko/inwheel-1.tar.gz Prototype])&lt;br /&gt;
* [http://www.hellkvist.org/software/ XMerlin]&lt;br /&gt;
&lt;br /&gt;
===== Patented input methods =====&lt;br /&gt;
* [http://depts.washington.edu/ewrite/ EdgeWrite], a unistroke character/word input method (reminiscent of Palm's Graffiti)&lt;br /&gt;
* [http://www.fitaly.com/wince/pocketpcfitaly.htm Fitaly Keyboard]&lt;br /&gt;
* [http://images.overstock.com/f/102/3117/8h/www.overstock.com/images/products/L10480944.jpg Input method used by Garmin] (Maybe patented?)&lt;br /&gt;
* [http://www.speedscript.biz/ SpeedScript]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/T9_%28predictive_text%29 T9] See http://www.tegic.com/about/patent-list.asp for legally addability for users in some countries. &lt;br /&gt;
* [http://www.tengo.net/ TenGO]&lt;br /&gt;
* [http://www.agiletext.com/ AgileText]&lt;br /&gt;
&lt;br /&gt;
===== Text input method surveys =====&lt;br /&gt;
&lt;br /&gt;
Here are some surveys / overviews of text entry methods that I turned up using Google:&lt;br /&gt;
* [http://www.dcs.gla.ac.uk/~jhw/text.html Text entry] A web page with a survey of text entry methods by John Williamson&lt;br /&gt;
* Poika Isokoski, [http://www.cs.uta.fi/~poika/g/g.html A Minimal Device-Independent Text Input Method], has a chapter listing existing approaches ca. 1999&lt;br /&gt;
&lt;br /&gt;
===== Other ways to enter text =====&lt;br /&gt;
* Once there is hardware with multi-touch screen support, [[Wishlist:Spell weaving|gesturing with 2-3 fingers]] might offer interesting possibilities.&lt;br /&gt;
* Use [[VoiceText|voice to dictate text]]&lt;br /&gt;
* Use [[Optical Character Recognition]] and [[Barcode Recognition]] on an image that exists on the file system or via a picture that has just been taken (even if it is a temporary picture only for this purpose).&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Speedwords Dutton Speedwords]&lt;br /&gt;
&lt;br /&gt;
===== Interesting hardware input devices =====&lt;br /&gt;
* [http://www.mobilitysite.com/2007/02/small_compact_bluetooth_keyboard.php Credit-card sized bluetooth keyboard] (Note: apparently supports only Bluetooth Serial Port Profile and not HID; supportable, of course, perhaps using existing user space daemon [http://handhelds.org/moin/moin.cgi/kbdd kbdd])&lt;br /&gt;
* [http://www.thinkgeek.com/computing/input/8193/ Bluetooth laser virtual keyboard] eventually could be built into the phone once more miniaturized.&lt;br /&gt;
* [http://www.thinkgeek.com/computing/input/6c82/ Frogpad]&lt;br /&gt;
* [http://www.spartechnik.de/start.htm?d_Keyb_Mini_Mini_Bluetooth_Keyboard_im_Scheckkartenformat.htm Freedom Mini], apparently not manufactured anymore but still sold and works out of the box with Bluez' hidd. Has a spring-loaded hinge for squeezing a phone/PDA against the keyboard; seems like a Neo could attach nicely but don't have one to actually test. --[[User:Mjr|Mjr]] 10:30, 15 May 2007 (CEST)&lt;br /&gt;
* [http://www.3pointd.com/20070518/finger-mounted-3d-mouse-from-undergrads/ experimental ring-mouse]&lt;br /&gt;
* Livescribe's [http://www.livescribe.com/sneakpeek/index.html smartpen]; could act as touchscreen pen + laser + regular pen + &amp;quot;intelligent&amp;quot; pen + OCR device.&lt;br /&gt;
&lt;br /&gt;
[[Category:Ideas]]&lt;/div&gt;</summary>
		<author><name>Fthiery</name></author>	</entry>

	</feed>