{"id":146,"date":"2008-11-25T16:23:07","date_gmt":"2008-11-25T06:53:07","guid":{"rendered":"http:\/\/www.clearchain.com\/blog\/?p=146"},"modified":"2008-12-05T11:46:31","modified_gmt":"2008-12-05T02:16:31","slug":"adding-multiple-mice-support-to-fltk-using-mpx","status":"publish","type":"post","link":"https:\/\/www.clearchain.com\/blog\/posts\/adding-multiple-mice-support-to-fltk-using-mpx","title":{"rendered":"Adding Multiple Mice Support to FLTK using MPX"},"content":{"rendered":"<p>For a while now I&#8217;ve been working on modifying <a href=\"http:\/\/fltk.org\">FLTK<\/a> to support multiple Mice. We need this functionality for applications we are working on. FLTK was chosen for a number of reasons.\u00a0<\/p>\n<ol>\n<li>It&#8217;s light weight<\/li>\n<li>It&#8217;s cross platform<\/li>\n<li>It was already in use by the applications being extended.<\/li>\n<\/ol>\n<div>However, FLTK didn&#8217;t support multiple mice out the box. Multiple Mice support exists both under Win32 via the RAWINPUT api and under\u00a0<a href=\"http:\/\/www.x.org\">Xorg<\/a>\u00a0via <a href=\"http:\/\/wearables.unisa.edu.au\/mpx\">MPX<\/a>.<\/div>\n<div>Though support in the various toolkits is still lacking. Not surprizing considering how recent MPX\/RAWINPUT is.<\/div>\n<p><!--more--><\/p>\n<div>MPX was the natural choice for the first implementation of multiple choice in a toolkit.\u00a0<\/div>\n<div>MPX is built into the windowing system hence focus, grabs and cursor rending is all semi transparently delt with where as RAWINPUT has you doing most the work yourself.<\/div>\n<div>Hence I set about modifying FLTK to support Multiple Mice using MPX.<\/div>\n<div>Results so far have been quite good. Due to FLTK internally doing most of it&#8217;s own component hit testing, having to deal with a window per component wasn&#8217;t needed. Instead a simple API extending the existing toolkit has been created.<\/div>\n<div>The patch implementing this API and the relevant glue to use it is available at:\u00a0<a href=\"http:\/\/wcl.ml.unisa.edu.au\/~closebs\/downloads\/fltk-1.3-mpx.patch\">http:\/\/wcl.ml.unisa.edu.au\/~closebs\/downloads\/fltk-1.3-mpx.patch<\/a><\/div>\n<div>This patch against the current 1.3 SVN (rev\u00a06524)\u00a0development branch and provides the following API extensions:<\/div>\n<div>Creation of FL\/Fl_Mouse.H which defines two important types:<\/div>\n<div><strong><span style=\"text-decoration: underline;\">Types:<\/span><\/strong><\/div>\n<div>\n<ul>\n<li>FL_MouseID <span style=\"white-space:pre\"> <\/span>&#8211; A type indicating the id of a mouse<\/li>\n<li>FL_Mouse \u00a0<span style=\"white-space:pre\"> <\/span>&#8211; A type that records information about a mouse (ie x, y, button state, etc)<\/li>\n<\/ul>\n<div><span style=\"text-decoration: underline;\"><strong>Functions\/Variables<\/strong><\/span><\/div>\n<\/div>\n<div>New functions\/variarables in FL\/Fl.H<\/div>\n<div>\n<ul>\n<li>FL::e_mouse_id \u00a0 \u00a0 \u00a0 <span style=\"white-space:pre\"> <\/span>&#8211; The id of the last mouse to cause an event<\/li>\n<li>FL::e_last_mouseid <span style=\"white-space:pre\"> <\/span>&#8211; The id of the last mouse in the system<\/li>\n<li>Fl::grab(Fl_MouseID)- Put a grab on a specific mouse<\/li>\n<li>Fl::get_last_mouseid- Return the ID of the last mouse know to the toolkit<\/li>\n<li>Fl::create_mouse()<span style=\"white-space:pre\"> <\/span>&#8211; Register a new mouse with the toolkit<\/li>\n<li>Fl::event_mouse_id()- Return the id of the mouse that caused the last event<\/li>\n<\/ul>\n<div>There has also been a number of changes to existing functions but all in a way which should be API compatible &#8211; sadly not ABI compatible.<\/div>\n<\/div>\n<div>These changes basically support passing in mouse id&#8217;s or storage of grabs\/focus per mouse, etc.<\/div>\n<div>There&#8217;s also been a test application created: test\/multiplemice<\/div>\n<div>This application, whilst very simple shows an example use of the MULTIPLE_MICE functionality. In it you can use two mice to drag two FLTK widgets around at the same time.\u00a0<\/div>\n<h2>I want to try<\/h2>\n<p>If you want to give the FLTK changes a shot it&#8217;s fairly simple all you have to do is:<\/p>\n<p>\u00a0<\/p>\n<ul>\n<li>Build a version of Xorg with MPX support (see <a href=\"http:\/\/wearables.unisa.edu.au\/mpx\">http:\/\/wearables.unisa.edu.au\/mpx<\/a>) for details.<\/li>\n<li>Build a version of xinput with MPX support\n<ul>\n<li>This will allow you to create multiple mice via<br \/>\nxinput create-master mymouse<br \/>\nxinput list &#8211;short \u00a0 \u00a0 \u00a0 # Take note of one of the mouse id&#8217;s, lets call it x and mymouse id y\u00a0<br \/>\nxinput reattach \u00a0x y<\/li>\n<\/ul>\n<\/li>\n<li>Grab the latest version of the 1.3 branch of FLTK from SVN (<a href=\"http:\/\/fltk.org\/svn.php\">http:\/\/fltk.org\/svn.php)<\/a><\/li>\n<li>Apply the patch at\u00a0<a href=\"http:\/\/wcl.ml.unisa.edu.au\/~closebs\/downloads\/fltk-1.3-mpx.patch\">http:\/\/wcl.ml.unisa.edu.au\/~closebs\/downloads\/fltk-1.3-mpx.patch<\/a>\n<ul>\n<li>patch -p0 &lt; fltk-1.3-mpx.patch<\/li>\n<\/ul>\n<\/li>\n<li>Configure with multiple mice support: .\/configure &#8211;enable-multiplemice<\/li>\n<li>Build the toolkit: make<\/li>\n<li>Test the multiple mice application: test\/multiplemice<\/li>\n<\/ul>\n<p>\u00a0<\/p>\n<h2>Future<\/h2>\n<p>Win32 support is currently under way with large chunks being already done. Though the lack of native cursor rendering under Win32 is causing greif. Other patches not far around the corner are a custom cursor patch, which allows a custom cursor per mouse as well as the ability to capture input events from the toolkit and inject input events into the toolkit &#8211; great for distributed event reconstruction.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Details about adding multiple mice support to the FLTK toolkit<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[21,6],"tags":[109,77,112,110,111],"class_list":["post-146","post","type-post","status-publish","format-standard","hentry","category-opensource","category-unisa","tag-fltk","tag-mpx","tag-multiple-mice","tag-toolkit","tag-win32"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Adding Multiple Mice Support to FLTK using MPX - ClearChain<\/title>\n<meta name=\"description\" content=\"Details about adding multiple mice support to the FLTK toolkit\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.clearchain.com\/blog\/posts\/adding-multiple-mice-support-to-fltk-using-mpx\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Benjamin Close\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.clearchain.com\/blog\/posts\/adding-multiple-mice-support-to-fltk-using-mpx#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.clearchain.com\/blog\/posts\/adding-multiple-mice-support-to-fltk-using-mpx\"},\"author\":{\"name\":\"Benjamin Close\",\"@id\":\"https:\/\/www.clearchain.com\/blog\/#\/schema\/person\/aef6faa2c32188398139db9270ca1c98\"},\"headline\":\"Adding Multiple Mice Support to FLTK using MPX\",\"datePublished\":\"2008-11-25T06:53:07+00:00\",\"dateModified\":\"2008-12-05T02:16:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.clearchain.com\/blog\/posts\/adding-multiple-mice-support-to-fltk-using-mpx\"},\"wordCount\":666,\"commentCount\":6,\"keywords\":[\"fltk\",\"MPX\",\"multiple mice\",\"toolkit\",\"win32\"],\"articleSection\":[\"OpenSource\",\"UniSA\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.clearchain.com\/blog\/posts\/adding-multiple-mice-support-to-fltk-using-mpx#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.clearchain.com\/blog\/posts\/adding-multiple-mice-support-to-fltk-using-mpx\",\"url\":\"https:\/\/www.clearchain.com\/blog\/posts\/adding-multiple-mice-support-to-fltk-using-mpx\",\"name\":\"Adding Multiple Mice Support to FLTK using MPX - ClearChain\",\"isPartOf\":{\"@id\":\"https:\/\/www.clearchain.com\/blog\/#website\"},\"datePublished\":\"2008-11-25T06:53:07+00:00\",\"dateModified\":\"2008-12-05T02:16:31+00:00\",\"author\":{\"@id\":\"https:\/\/www.clearchain.com\/blog\/#\/schema\/person\/aef6faa2c32188398139db9270ca1c98\"},\"description\":\"Details about adding multiple mice support to the FLTK toolkit\",\"breadcrumb\":{\"@id\":\"https:\/\/www.clearchain.com\/blog\/posts\/adding-multiple-mice-support-to-fltk-using-mpx#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.clearchain.com\/blog\/posts\/adding-multiple-mice-support-to-fltk-using-mpx\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.clearchain.com\/blog\/posts\/adding-multiple-mice-support-to-fltk-using-mpx#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.clearchain.com\/blog\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Adding Multiple Mice Support to FLTK using MPX\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.clearchain.com\/blog\/#website\",\"url\":\"https:\/\/www.clearchain.com\/blog\/\",\"name\":\"ClearChain\",\"description\":\"-= Daily Happenings =-\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.clearchain.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.clearchain.com\/blog\/#\/schema\/person\/aef6faa2c32188398139db9270ca1c98\",\"name\":\"Benjamin Close\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.clearchain.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/19dca0aa372edfa901b93c556dfda2e78ad4434558fe4d139598e086315d714a?s=96&d=mm&r=pg\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/19dca0aa372edfa901b93c556dfda2e78ad4434558fe4d139598e086315d714a?s=96&d=mm&r=pg\",\"caption\":\"Benjamin Close\"},\"sameAs\":[\"http:\/\/www.clearchain.com\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Adding Multiple Mice Support to FLTK using MPX - ClearChain","description":"Details about adding multiple mice support to the FLTK toolkit","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.clearchain.com\/blog\/posts\/adding-multiple-mice-support-to-fltk-using-mpx","twitter_misc":{"Written by":"Benjamin Close","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.clearchain.com\/blog\/posts\/adding-multiple-mice-support-to-fltk-using-mpx#article","isPartOf":{"@id":"https:\/\/www.clearchain.com\/blog\/posts\/adding-multiple-mice-support-to-fltk-using-mpx"},"author":{"name":"Benjamin Close","@id":"https:\/\/www.clearchain.com\/blog\/#\/schema\/person\/aef6faa2c32188398139db9270ca1c98"},"headline":"Adding Multiple Mice Support to FLTK using MPX","datePublished":"2008-11-25T06:53:07+00:00","dateModified":"2008-12-05T02:16:31+00:00","mainEntityOfPage":{"@id":"https:\/\/www.clearchain.com\/blog\/posts\/adding-multiple-mice-support-to-fltk-using-mpx"},"wordCount":666,"commentCount":6,"keywords":["fltk","MPX","multiple mice","toolkit","win32"],"articleSection":["OpenSource","UniSA"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.clearchain.com\/blog\/posts\/adding-multiple-mice-support-to-fltk-using-mpx#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.clearchain.com\/blog\/posts\/adding-multiple-mice-support-to-fltk-using-mpx","url":"https:\/\/www.clearchain.com\/blog\/posts\/adding-multiple-mice-support-to-fltk-using-mpx","name":"Adding Multiple Mice Support to FLTK using MPX - ClearChain","isPartOf":{"@id":"https:\/\/www.clearchain.com\/blog\/#website"},"datePublished":"2008-11-25T06:53:07+00:00","dateModified":"2008-12-05T02:16:31+00:00","author":{"@id":"https:\/\/www.clearchain.com\/blog\/#\/schema\/person\/aef6faa2c32188398139db9270ca1c98"},"description":"Details about adding multiple mice support to the FLTK toolkit","breadcrumb":{"@id":"https:\/\/www.clearchain.com\/blog\/posts\/adding-multiple-mice-support-to-fltk-using-mpx#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.clearchain.com\/blog\/posts\/adding-multiple-mice-support-to-fltk-using-mpx"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.clearchain.com\/blog\/posts\/adding-multiple-mice-support-to-fltk-using-mpx#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.clearchain.com\/blog"},{"@type":"ListItem","position":2,"name":"Adding Multiple Mice Support to FLTK using MPX"}]},{"@type":"WebSite","@id":"https:\/\/www.clearchain.com\/blog\/#website","url":"https:\/\/www.clearchain.com\/blog\/","name":"ClearChain","description":"-= Daily Happenings =-","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.clearchain.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.clearchain.com\/blog\/#\/schema\/person\/aef6faa2c32188398139db9270ca1c98","name":"Benjamin Close","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.clearchain.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/19dca0aa372edfa901b93c556dfda2e78ad4434558fe4d139598e086315d714a?s=96&d=mm&r=pg","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/19dca0aa372edfa901b93c556dfda2e78ad4434558fe4d139598e086315d714a?s=96&d=mm&r=pg","caption":"Benjamin Close"},"sameAs":["http:\/\/www.clearchain.com"]}]}},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.clearchain.com\/blog\/wp-json\/wp\/v2\/posts\/146","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.clearchain.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.clearchain.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.clearchain.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.clearchain.com\/blog\/wp-json\/wp\/v2\/comments?post=146"}],"version-history":[{"count":4,"href":"https:\/\/www.clearchain.com\/blog\/wp-json\/wp\/v2\/posts\/146\/revisions"}],"predecessor-version":[{"id":161,"href":"https:\/\/www.clearchain.com\/blog\/wp-json\/wp\/v2\/posts\/146\/revisions\/161"}],"wp:attachment":[{"href":"https:\/\/www.clearchain.com\/blog\/wp-json\/wp\/v2\/media?parent=146"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.clearchain.com\/blog\/wp-json\/wp\/v2\/categories?post=146"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.clearchain.com\/blog\/wp-json\/wp\/v2\/tags?post=146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}