Updated patch.Uses CW and CCW instead of Up and Down for touch rings, adds (optional) arrows to show rotation on touch rings, renamed "indicator" as "leader" as per previous reviews.
>From b877ff84ee108ce2115a40b4d7c8edfd47382b73 Mon Sep 17 00:00:00 2001 From: Olivier Fourdan <ofour...@redhat.com> Date: Tue, 27 Nov 2012 09:52:42 +0100 Subject: [PATCH] data: Add leaders to layouts
To match the buttons with their corresponding labels, the layout SVG must also provide a leader line for each label in the form of a line that links each button and its label. Improves the layout SVG for the Cintiq 12WX and Intuos 5 M by adding details and rounded buttons to match the look of the real device. Buttons, labels and indicators are now grouped in the SVG layout for better clarity of the SVG. Adds indicators to the SVG check test iprogram so that incomplete layouts would be detected. Replace use of ambiguous "Up" and "Down" in ring controls with "CW" (Clockwise) and "CCW" (Counter Clockwise) which are more appropriate for circular motion (note that "CCW" is used in place of "Up" and "CW" in place of "Down"). Add possible use of "fake" buttons to materialize the type of motion expected in touch strips/rings (optional, not mandatory as not present on the real device). Improves the SVG layout display sample program to show touch ring/touch strips labels and label indicators. Signed-off-by: Olivier Fourdan <ofour...@redhat.com> --- data/layouts/README | 124 +++++++++++++++++++++++++++--- data/layouts/cintiq-12wx.svg | 118 ++++++++++++++++++++++------- data/layouts/intuos5-m.svg | 87 +++++++++++++++------ test/tablet-svg-validity.c | 83 ++++++++++++++++++-- tools/show-svg-image.c | 176 +++++++++++++++++++++++++------------------ 5 files changed, 448 insertions(+), 140 deletions(-) diff --git a/data/layouts/README b/data/layouts/README index 37b644d..fda7814 100644 --- a/data/layouts/README +++ b/data/layouts/README @@ -56,6 +56,56 @@ Touch rings use the following convention: id="Strip2" class="Strip2 TouchStrip" +Note: Additional "fake" buttons (ie actual controls not found on the real +device) can be added to touch controls to help showing the type of action +expected on the control, like for example circular motion on a touch ring +or vertical motion on a touch strip. + +These controls can be named: + + - First touch ring, rotating clockwise: + + id="RingCW" + class="RingCW Button" + + - First touch ring, rotating counter clockwise: + + id="RingCCW" + class="RingCCW Button" + + - Second touch ring, rotating clockwise: + + id="Ring2CW" + class="Ring2CW Button" + + - Second touch ring, rotating counter clockwise: + + id="Ring2CCW" + class="Ring2CCW Button" + + - First touch strip, moving up: + + id="StripUp" + class="StripUp Button" + + - First touch strip, moving down: + + id="StripDown" + class="StripDown Button" + + - Second touch strip, moving up: + + id="Strip2Up" + class="Strip2Up Button" + + - Second touch strip, moving down: + + id="Strip2Down" + class="Strip2Down Button" + +The use of those "fake" buttons is left at the discretion of the designer +and is not mandatory nor enforced. + * Labels The role of the labels in the SVG is to give applications an indication on @@ -71,6 +121,7 @@ Each button's label ID in the SVG is made of the string "Label" with ID of the button to which it applies, between 'A' and 'Z'. Class includes both the button ID and the string "Label". + id="LabelA" class="A Label" @@ -84,23 +135,23 @@ For the special case of mode-switch buttons, the class also list "ModeSwitch": Touch-rings and touch-strips generate Up and Down events, therefore 2 different labels are needed for each touch-ring/touch-strip control. - id="LabelRingUp" - class="RingUp Ring Label" + id="LabelRingCCW" + class="RingCCW Ring Label" and - id="LabelRingDown" - class="RingDown Ring Label" + id="LabelRingCW" + class="RingCW Ring Label" The second touch-ring button is identified by "Ring2" in place of "Ring": - id="LabelRing2Up" - class="Ring2Up Ring2 Label" + id="LabelRing2CCW" + class="Ring2CCW Ring2 Label" and - id="LabelRingDown" - class="Ring2Down Ring2 Label" + id="LabelRingCW" + class="Ring2CW Ring2 Label" Touchstrips button follow the same naming scheme, using "Strip" and "Strip2" to name the first and second touch-strip. @@ -120,5 +171,60 @@ Second touch-strip: and - id="LabelRingDown" + id="LabelRingCW" class="Strip2Down Strip2 Label" + + - Caption leader lines + +To match the buttons with their corresponding labels, the SVG must also +provide a leader line for each label in the form of a line that links +each button and its label. + +Each leader line follows the same naming convention as the labels, using +the special name "Leader" in place of "Label", ie: + + id="LeaderA" + class="A Leader" + +Touch-rings and touch-strips have 2 different labels and therefore 2 leader +lines. + + id="LeaderRingCCW" + class="RingCCW Ring Leader" + + and + + id="LeaderRingCW" + class="RingCW Ring Leader" + +The second touch-ring button is identified by "Ring2" in place of "Ring": + + id="LeaderRing2CCW" + class="Ring2CCW Ring2 Leader" + + and + + id="LeaderRingCW" + class="Ring2CW Ring2 Leader" + +Touchstrips button follow the same naming scheme, using "Strip" and "Strip2" +to name the first and second touch-strip. + + id="LeaderStripUp" + class="StripUp Strip Leader" + + and + + id="LeaderStripDown" + class="StripDown Strip Leader" + +Second touch-strip: + + id="LeaderStrip2Up" + class="Strip2Up Strip2 Leader" + + and + + id="LeaderStrip2Down" + class="Strip2Down Strip2 Leader" + diff --git a/data/layouts/cintiq-12wx.svg b/data/layouts/cintiq-12wx.svg index 370283d..1095293 100644 --- a/data/layouts/cintiq-12wx.svg +++ b/data/layouts/cintiq-12wx.svg @@ -2,33 +2,93 @@ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg xmlns="http://www.w3.org/2000/svg" version="1.1" - style="color:#000000;stroke:#bebebe;fill:#000000;stroke-linejoin:round;stroke-width:1;font-size:8" - id="cintiq-12wx" width="405" height="270" > - <title id="title" >Wacom Cintiq 12WX</title> - <rect id="ButtonA" class="A Button" x="40" y="54" width="11" height="17" /> - <text id="LabelA" class="A Label" x="60" y="63" >A</text> - <rect id="ButtonB" class="B Button" x="40" y="72" width="11" height="17" /> - <text id="LabelB" class="B Label" x="60" y="81" >B</text> - <rect id="ButtonC" class="C Button" x="28" y="54" width="11" height="35" /> - <text id="LabelC" class="C Label" x="60" y="72" >C</text> - <rect id="ButtonD" class="D Button" x="28" y="90" width="23" height="11" /> - <text id="LabelD" class="D Label" x="60" y="96" >D</text> - <rect id="ButtonE" class="E Button" x="352" y="54" width="11" height="17" /> - <text id="LabelE" class="E Label" x="342" y="63" >E</text> - <rect id="ButtonF" class="F Button" x="352" y="72" width="11" height="17" /> - <text id="LabelF" class="F Label" x="342" y="81" >F</text> - <rect id="ButtonG" class="G Button" x="364" y="54" width="11" height="35" /> - <text id="LabelG" class="G Label" x="342" y="72" >G</text> - <rect id="ButtonH" class="H Button" x="352" y="90" width="23" height="11" /> - <text id="LabelH" class="H Label" x="342" y="96" >H</text> - <rect id="ButtonI" class="I Button" x="28" y="42" width="23" height="11" /> - <text id="LabelI" class="I Label" x="60" y="51" >I</text> - <rect id="ButtonJ" class="J Button" x="352" y="42" width="23" height="11" /> - <text id="LabelJ" class="J Label" x="342" y="51" >J</text> - <rect id="Strip" class="Strip TouchStrip" x="10" y="41" width="12" height="60" /> - <text id="LabelStripUp" class="StripUp Strip Label" x="16" y="30" >Up</text> - <text id="LabelStripDown" class="StripDown Strip Label" x="16" y="110" >Down</text> - <rect id="Strip2" class="Strip2 TouchStrip" x="382" y="41" width="12" height="60" /> - <text id="LabelStrip2Up" class="Strip2Up Strip2 Label" x="388" y="30" >Up</text> - <text id="LabelStrip2Down" class="Strip2Down Strip2 Label" x="388" y="110" >Down</text> + style="color:#000000;stroke:#7f7f7f;fill:#none;stroke-width:.25;font-size:8" + id="cintiq-12wx" width="405" height="270" > + <title id="title" >Wacom Cintiq 12WX</title> + <g> + <rect id="ButtonA" class="A Button" rx=".5" ry=".5" x="40" y="54" width="11" height="17" /> + <path id="LeaderA" class="A Leader" d="M 53 63 L 65 63 L 65 72 L 78 72" /> + <text id="LabelA" class="A Label" x="80" y="72" style="text-anchor:start;" >A</text> + </g> + <g> + <rect id="ButtonB" class="B Button" rx=".5" ry=".5" x="40" y="72" width="11" height="17" /> + <circle id="DotB1" cx="45.5" cy="77.5" r=".5" /> + <circle id="DotB2" cx="45.5" cy="80.5" r=".5" /> + <circle id="DotB3" cx="45.5" cy="83.5" r=".5" /> + <path id="LeaderB" class="B Leader" d="M 53 81 L 65 81 L 65 87 L 78 87" /> + <text id="LabelB" class="B Label" x="80" y="87" style="text-anchor:start;" >B</text> + </g> + <g> + <rect id="ButtonC" class="C Button" x="28" y="54" + rx=".5" ry=".5" width="11" height="35" /> + <path id="LeaderC" class="C Leader" d="M 26 72 L 25 72 L 25 35 L 65 35 L 65 42 L 78 42" /> + <text id="LabelC" class="C Label" x="80" y="42" style="text-anchor:start;" >C</text> + </g> + <g> + <rect id="ButtonD" class="D Button" x="28" y="90" + rx=".5" ry=".5" width="23" height="11" /> + <path id="LeaderD" class="D Leader" d="M 53 96 L 65 96 L 65 102 L 78 102" /> + <text id="LabelD" class="D Label" x="80" y="102" style="text-anchor:start;" >D</text> + </g> + <g> + <rect id="ButtonE" class="E Button" x="352" y="54" + rx=".5" ry=".5" width="11" height="17" /> + <path id="LeaderE" class="E Leader" d="M 350 63 L 338 63 L 338 72 L 324 72" /> + <text id="LabelE" class="E Label" x="322" y="72" style="text-anchor:end;" >E</text> + </g> + <g> + <rect id="ButtonF" class="F Button" x="352" y="72" + rx=".5" ry=".5" width="11" height="17" /> + <circle id="DotF1" cx="357.5" cy="77.5" r=".5" /> + <circle id="DotF2" cx="357.5" cy="80.5" r=".5" /> + <circle id="DotF3" cx="357.5" cy="83.5" r=".5" /> + <path id="LeaderF" class="F Leader" d="M 350 81 L 338 81 L 338 87 L 324 87" /> + <text id="LabelF" class="F Label" x="322" y="87" style="text-anchor:end;" >F</text> + </g> + <g> + <rect id="ButtonG" class="G Button" x="364" y="54" + rx=".5" ry=".5" width="11" height="35" /> + <path id="LeaderG" class="G Leader" d="M 377 72 L 378 72 L 378 35 L 338 35 L 338 42 L 324 42" /> + <text id="LabelG" class="G Label" x="322" y="42" style="text-anchor:end;" >G</text> + </g> + <g> + <rect id="ButtonH" class="H Button" x="352" y="90" + rx=".5" ry=".5" width="23" height="11" /> + <path id="LeaderH" class="H Leader" d="M 350 96 L 338 96 L 338 102 L 324 102" /> + <text id="LabelH" class="H Label" x="322" y="102" style="text-anchor:end;" >H</text> + </g> + <g> + <rect id="ButtonI" class="I Button" x="28" y="42" + rx=".5" ry=".5" width="23" height="11" /> + <circle id="DotI1" cx="36.5" cy="47.5" r=".5" /> + <circle id="DotI2" cx="39.5" cy="47.5" r=".5" /> + <circle id="DotI3" cx="42.5" cy="47.5" r=".5" /> + <path id="LeaderI" class="I Leader" d="M 53 48 L 65 48 L 65 57 L 78 57" /> + <text id="LabelI" class="I Label" x="80" y="57" style="text-anchor:start;" >I</text> + </g> + <g> + <rect id="ButtonJ" class="J Button" x="352" y="42" + rx=".5" ry=".5" width="23" height="11" /> + <circle id="DotJ1" cx="360.5" cy="47.5" r=".5" /> + <circle id="DotJ2" cx="363.5" cy="47.5" r=".5" /> + <circle id="DotJ3" cx="366.5" cy="47.5" r=".5" /> + <path id="LeaderJ" class="J Leader" d="M 350 48 L 338 48 L 338 57 L 324 57" /> + <text id="LabelJ" class="J Label" x="322" y="57" style="text-anchor:end;" >J</text> + </g> + <g> + <rect id="Strip" class="Strip TouchStrip" x="10" y="41" + rx="1" ry="1" width="12" height="60" /> + <path id="LeaderStripUp" class="StripUp Strip Leader" d="M 16 39 L 16 27 L 78 27" /> + <text id="LabelStripUp" class="StripUp Strip Label" x="80" y="27" style="text-anchor:start;" >Up</text> + <path id="LeaderStripDown" class="StripDown Strip Leader" d="M 16 103 L 16 117 L 78 117" /> + <text id="LabelStripDown" class="StripDown Strip Label" x="80" y="117" style="text-anchor:start;" >Down</text> + </g> + <g> + <rect id="Strip2" class="Strip2 TouchStrip" x="382" y="41" + rx="1" ry="1" width="12" height="60" /> + <path id="LeaderStrip2Up" class="Strip2Up Strip2 Leader" d="M 388 39 L 388 27 L 325 27" /> + <text id="LabelStrip2Up" class="Strip2Up Strip2 Label" x="322" y="27" style="text-anchor:end;" >Up</text> + <path id="LeaderStrip2Down" class="Strip2Down Strip2 Leader" d="M 388 103 L 388 117 L 325 117" /> + <text id="LabelStrip2Down" class="Strip2Down Strip2 Label" x="322" y="117" style="text-anchor:end;" >Down</text> + </g> </svg> diff --git a/data/layouts/intuos5-m.svg b/data/layouts/intuos5-m.svg index 748959f..edb9f42 100644 --- a/data/layouts/intuos5-m.svg +++ b/data/layouts/intuos5-m.svg @@ -2,28 +2,67 @@ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg xmlns="http://www.w3.org/2000/svg" version="1.1" - style="color:#000000;stroke:#bebebe;fill:#f0f0f0;stroke-linejoin:round;stroke-width:1;font-size:8" - id="intuos5-m" width="380" height="250"> - <title id="title" >Wacom Intuos5 M Touch</title> - <rect id="ButtonB" class="B Button" x="24" y="40" width="20" height="12" /> - <text id="LabelB" class="B Label" x="50" y="46" >A</text> - <rect id="ButtonC" class="C Button" x="24" y="54" width="20" height="12" /> - <text id="LabelC" class="C Label" x="50" y="60" >B</text> - <rect id="ButtonD" class="D Button" x="24" y="68" width="20" height="12" /> - <text id="LabelD" class="D Label" x="50" y="74" >C</text> - <rect id="ButtonE" class="E Button" x="24" y="82" width="20" height="12" /> - <text id="LabelE" class="E Label" x="50" y="88" >D</text> - <rect id="ButtonF" class="F Button" x="24" y="156" width="20" height="12" /> - <text id="LabelF" class="F Label" x="50" y="162" >E</text> - <rect id="ButtonG" class="G Button" x="24" y="170" width="20" height="12" /> - <text id="LabelG" class="G Label" x="50" y="176" >F</text> - <rect id="ButtonH" class="H Button" x="24" y="184" width="20" height="12" /> - <text id="LabelH" class="H Label" x="50" y="190" >G</text> - <rect id="ButtonI" class="I Button" x="24" y="198" width="20" height="12" /> - <text id="LabelI" class="I Label" x="50" y="206" >H</text> - <circle id="Ring" class="Ring TouchRing" cx="34" cy="125" r="19.5" /> - <text id="LabelRingUp" class="RingUp Ring Label" x="60" y="105" >Up</text> - <text id="LabelRingDown" class="RingDown Ring Label" x="60" y="145" >Down</text> - <circle id="ButtonA" class="A ModeSwitch Button" cx="34" cy="125" r="9.5" /> - <text id="LabelA" class="A ModeSwitch Label" x="60" y="125" >I</text> + style="color:#000000;stroke:#7f7f7f;fill:none;stroke-width:.25;font-size:8" + id="intuos5-m" width="380" height="250" > + <title id="title" >Wacom Intuos5 M Touch</title> + <g> + <rect id="ButtonB" class="B Button" rx="2" ry="2" x="24" y="40" width="20" height="12" /> + <path id="LeaderB" class="B Leader" d="M 46 46 L 50 46" /> + <text id="LabelB" class="B Label" x="52" y="46" style="text-anchor:start;" >B</text> + </g> + <g> + <rect id="ButtonC" class="C Button" rx="2" ry="2" x="24" y="54" width="20" height="12" /> + <rect id="DotC1" rx="1" ry="1" x="30" y="59.5" width="8" height="1" /> + <path id="LeaderC" class="C Leader" d="M 46 60 L 50 60" /> + <text id="LabelC" class="C Label" x="52" y="60" style="text-anchor:start;" >C</text> + </g> + <g> + <rect id="ButtonD" class="D Button" rx="2" ry="2" x="24" y="68" width="20" height="12" /> + <circle id="DotD1" cx="34" cy="74" r=".75" /> + <path id="LeaderD" class="D Leader" d="M 46 74 L 50 74" /> + <text id="LabelD" class="D Label" x="52" y="74" style="text-anchor:start;" >D</text> + </g> + <g> + <rect id="ButtonE" class="E Button" rx="2" ry="2" x="24" y="82" width="20" height="12" /> + <path id="LeaderE" class="E Leader" d="M 46 88 L 50 88" /> + <text id="LabelE" class="E Label" x="52" y="88" style="text-anchor:start;" >E</text> + </g> + <g> + <rect id="ButtonF" class="F Button" rx="2" ry="2" x="24" y="156" width="20" height="12" /> + <path id="LeaderF" class="F Leader" d="M 46 162 L 50 162" /> + <text id="LabelF" class="F Label" x="52" y="162" style="text-anchor:start;" >F</text> + </g> + <g> + <rect id="ButtonG" class="G Button" rx="2" ry="2" x="24" y="170" width="20" height="12" /> + <circle id="DotG1" cx="34" cy="176" r=".75" /> + <path id="LeaderG" class="G Leader" d="M 46 176 L 50 176" /> + <text id="LabelG" class="G Label" x="52" y="176" style="text-anchor:start;" >G</text> + </g> + <g> + <rect id="ButtonH" class="H Button" rx="2" ry="2" x="24" y="184" width="20" height="12" /> + <rect id="DotH1" rx="1" ry="1" x="30" y="189.5" width="8" height="1" /> + <path id="LeaderH" class="H Leader" d="M 46 190 L 50 190" /> + <text id="LabelH" class="H Label" x="52" y="190" style="text-anchor:start;" >H</text> + </g> + <g> + <rect id="ButtonI" class="I Button" rx="2" ry="2" x="24" y="198" width="20" height="12" /> + <path id="LeaderI" class="I Leader" d="M 46 206 L 50 206" /> + <text id="LabelI" class="I Label" x="52" y="206" style="text-anchor:start;" >I</text> + </g> + <g> + <circle id="Ring" class="Ring TouchRing" cx="34" cy="125" r="19.5" /> + <path id="LeaderRingCCW" class="RingCCW Ring Leader" d="M 34 105 L 34 103 L 60 103" /> + <text id="LabelRingCCW" class="RingCCW Ring Label" x="62" y="103" style="text-anchor:start;" >CCW</text> + <path id="RingCCW" class="RingCCW Button" + d="M 31 111 l 3 -1.5 l 0 1 a 7.5 7.5 0 0 1 5 1.5 a 6.5 6.5 0 0 0 -5 -0.5 l 0 1 z" /> + <path id="LeaderRingCW" class="RingCW Ring Leader" d="M 34 145 L 34 147 L 60 147" /> + <text id="LabelRingCW" class="RingCW Ring Label" x="62" y="147" style="text-anchor:start;" >CW</text> + <path id="RingCW" class="RingCW Button" + d="M 31 139 l 3 -1.5 l 0 1 a 7.5 7.5 0 0 0 5 -1 a 6.5 6.5 0 0 1 -5 2 l 0 1 z" /> + </g> + <g> + <circle id="ButtonA" class="A ModeSwitch Button" cx="34" cy="125" r="9.5" /> + <path id="LeaderA" class="A ModeSwitch Leader" d="M 56 125 L 60 125" /> + <text id="LabelA" class="A ModeSwitch Label" x="62" y="125" style="text-anchor:start;" >A</text> + </g> </svg> diff --git a/test/tablet-svg-validity.c b/test/tablet-svg-validity.c index 0dca5a4..04cbc0f 100644 --- a/test/tablet-svg-validity.c +++ b/test/tablet-svg-validity.c @@ -1,5 +1,5 @@ /* - * Copyright ?? 2012 Red Hat, Inc. + * Copyright © 2012 Red Hat, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without @@ -127,7 +127,7 @@ check_button (xmlNodePtr cur, WacomDevice *device, char button, gchar *type) } static void -check_touch (xmlNodePtr cur, gchar *id, gchar *type) +check_touchstrip (xmlNodePtr cur, gchar *id, gchar *type) { char *sub; char *class; @@ -157,6 +157,76 @@ check_touch (xmlNodePtr cur, gchar *id, gchar *type) class = g_strdup_printf ("%sDown %s Label", id, id); verify_has_class (node, class); g_free (class); + + sub = g_strdup_printf ("Leader%sUp", id); + node = verify_has_sub (cur, sub); + g_assert (node != NULL); + g_free (sub); + + class = g_strdup_printf ("%sUp %s Leader", id, id); + verify_has_class (node, class); + g_free (class); + + sub = g_strdup_printf ("Leader%sDown", id); + node = verify_has_sub (cur, sub); + g_assert (node != NULL); + g_free (sub); + + class = g_strdup_printf ("%sDown %s Leader", id, id); + verify_has_class (node, class); + g_free (class); +} + + +static void +check_touchring (xmlNodePtr cur, gchar *id, gchar *type) +{ + char *sub; + char *class; + xmlNodePtr node; + + node = verify_has_sub (cur, id); + g_assert (node != NULL); + + class = g_strdup_printf ("%s %s", id, type); + verify_has_class (node, class); + g_free (class); + + sub = g_strdup_printf ("Label%sCCW", id); + node = verify_has_sub (cur, sub); + g_assert (node != NULL); + g_free (sub); + + class = g_strdup_printf ("%sCCW %s Label", id, id); + verify_has_class (node, class); + g_free (class); + + sub = g_strdup_printf ("Label%sCW", id); + node = verify_has_sub (cur, sub); + g_assert (node != NULL); + g_free (sub); + + class = g_strdup_printf ("%sCW %s Label", id, id); + verify_has_class (node, class); + g_free (class); + + sub = g_strdup_printf ("Leader%sCCW", id); + node = verify_has_sub (cur, sub); + g_assert (node != NULL); + g_free (sub); + + class = g_strdup_printf ("%sCCW %s Leader", id, id); + verify_has_class (node, class); + g_free (class); + + sub = g_strdup_printf ("Leader%sCW", id); + node = verify_has_sub (cur, sub); + g_assert (node != NULL); + g_free (sub); + + class = g_strdup_printf ("%sCW %s Leader", id, id); + verify_has_class (node, class); + g_free (class); } static void @@ -203,18 +273,19 @@ verify_tablet_layout (WacomDeviceDatabase *db, WacomDevice *device) for (button = 'A'; button < 'A' + num_buttons; button++) { check_button (cur, device, button, "Button"); check_button (cur, device, button, "Label"); + check_button (cur, device, button, "Leader"); } /* Touch rings */ if (libwacom_has_ring(device)) - check_touch (cur, "Ring", "TouchRing"); + check_touchring (cur, "Ring", "TouchRing"); if (libwacom_has_ring2(device)) - check_touch (cur, "Ring2", "TouchRing"); + check_touchring (cur, "Ring2", "TouchRing"); /* Touch strips */ if (libwacom_get_num_strips(device) > 0) - check_touch (cur, "Strip", "TouchStrip"); + check_touchstrip (cur, "Strip", "TouchStrip"); if (libwacom_get_num_strips(device) > 1) - check_touch (cur, "Strip2", "TouchStrip"); + check_touchstrip (cur, "Strip2", "TouchStrip"); xmlFreeDoc(doc); diff --git a/tools/show-svg-image.c b/tools/show-svg-image.c index 01a7b13..427b5ce 100644 --- a/tools/show-svg-image.c +++ b/tools/show-svg-image.c @@ -1,5 +1,5 @@ /* - * Copyright ?? 2012 Red Hat, Inc. + * Copyright © 2012 Red Hat, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without @@ -37,10 +37,10 @@ #include "libwacom.h" -#define INACTIVE_COLOR "#2d2d2d" -#define ACTIVE_COLOR "#ffffff" -#define STROKE_COLOR "#b4b4b4" -#define DARK_COLOR "#141414" +#define INACTIVE_COLOR "#ededed" +#define ACTIVE_COLOR "#729fcf" +#define STROKE_COLOR "#000000" +#define DARK_COLOR "#535353" #define BACK_COLOR "#000000" /* Convenient struct to store our stuff around */ @@ -100,76 +100,96 @@ get_sub_location (cairo_t *cairo_context, RsvgHandle *handle, const char *sub, d } static void -print_button_labels (cairo_t *cairo_context, Tablet *tablet) +print_label (cairo_t *cairo_context, Tablet *tablet, const char *sub, const char *markup, WacomButtonFlags flags) { - char button; - GtkWidget *widget; - GtkAllocation allocation; + GtkWidget *widget; + GtkAllocation allocation; + GtkStyle *style; + PangoContext *pango_context; + PangoLayout *pango_layout; + PangoRectangle pango_rect; + double label_x, label_y; + int x, y; + + if (!get_sub_location (cairo_context, tablet->handle, sub, &label_x, &label_y, NULL, NULL)) + return; widget = GTK_WIDGET(tablet->widget); gtk_widget_get_allocation(widget, &allocation); + style = gtk_widget_get_style (widget); + pango_context = gtk_widget_get_pango_context (widget); + pango_layout = pango_layout_new (pango_context); + + pango_layout_set_markup (pango_layout, markup, -1); + pango_layout_get_pixel_extents (pango_layout, NULL, &pango_rect); + + if (flags & WACOM_BUTTON_POSITION_LEFT) { + pango_layout_set_alignment (pango_layout, PANGO_ALIGN_LEFT); + x = (int) label_x + pango_rect.x; + y = (int) label_y + pango_rect.y - pango_rect.height / 2; + } else if (flags & WACOM_BUTTON_POSITION_RIGHT) { + pango_layout_set_alignment (pango_layout, PANGO_ALIGN_RIGHT); + x = (int) label_x + pango_rect.x - pango_rect.width; + y = (int) label_y + pango_rect.y - pango_rect.height / 2; + } else { + pango_layout_set_alignment (pango_layout, PANGO_ALIGN_CENTER); + x = (int) label_x + pango_rect.x - pango_rect.width / 2; + y = (int) label_y + pango_rect.y; + } + + gtk_paint_layout (style, + gtk_widget_get_window (widget), + 0, + TRUE, + &allocation, + widget, + NULL, + x, + y, + pango_layout); + + g_object_unref (pango_layout); +} + +static void +print_button_labels (cairo_t *cairo_context, Tablet *tablet) +{ + char button; for (button = 'A'; button < 'A' + tablet->num_buttons; button++) { WacomButtonFlags flags; - GtkStyle *style; - PangoContext *pango_context; - PangoLayout *pango_layout; - PangoRectangle pango_rect; - double label_x, label_y; - int x, y; gchar *sub; - gchar *markup; + gchar *label; flags = libwacom_get_button_flag(tablet->device, button); sub = g_strdup_printf ("#Label%c", button); - if (!get_sub_location (cairo_context, tablet->handle, sub, &label_x, &label_y, NULL, NULL)) { - g_warning ("Failed to retrieve %s position", sub); - goto next; - } - - /* Write the label */ - style = gtk_widget_get_style (widget); - pango_context = gtk_widget_get_pango_context (widget); - pango_layout = pango_layout_new (pango_context); if (button == tablet->active_button) - markup = g_strdup_printf ("<span foreground=\"" ACTIVE_COLOR "\" weight=\"bold\">Button %c</span>", button); + label = g_strdup_printf ("<span foreground=\"" ACTIVE_COLOR "\" >Button %c</span>", button); else - markup = g_strdup_printf ("<span foreground=\"" INACTIVE_COLOR "\" weight=\"bold\">Button %c</span>", button); - pango_layout_set_markup (pango_layout, markup, -1); - g_free (markup); - - pango_layout_get_pixel_extents (pango_layout, NULL, &pango_rect); - - if (flags & WACOM_BUTTON_POSITION_LEFT) { - pango_layout_set_alignment (pango_layout, PANGO_ALIGN_LEFT); - x = (int) label_x; - y = (int) label_y + pango_rect.height / 2; - } else if (flags & WACOM_BUTTON_POSITION_RIGHT) { - pango_layout_set_alignment (pango_layout, PANGO_ALIGN_RIGHT); - x = (int) label_x - pango_rect.width; - y = (int) label_y + pango_rect.height / 2; - - } else { - pango_layout_set_alignment (pango_layout, PANGO_ALIGN_CENTER); - x = (int) label_x - pango_rect.width / 2; - y = (int) label_y; - } - - gtk_paint_layout (style, - gtk_widget_get_window (widget), - 0, - TRUE, - &allocation, - widget, - NULL, - x, - y, - pango_layout); - - g_object_unref (pango_layout); -next: + label = g_strdup_printf ("<span foreground=\"" INACTIVE_COLOR "\" >Button %c</span>", button); + print_label (cairo_context, tablet, sub, label, flags); + g_free (label); g_free (sub); } + + /* Touch rings */ + if (libwacom_has_ring(tablet->device)) { + print_label (cairo_context, tablet, "#LabelRingCCW", "<span foreground=\"" INACTIVE_COLOR "\" >Ring Counter Clockwise</span>", WACOM_BUTTON_POSITION_LEFT); + print_label (cairo_context, tablet, "#LabelRingCW", "<span foreground=\"" INACTIVE_COLOR "\" >Ring Clockwise</span>", WACOM_BUTTON_POSITION_LEFT); + } + if (libwacom_has_ring2(tablet->device)) { + print_label (cairo_context, tablet, "#LabelRing2CCW", "<span foreground=\"" INACTIVE_COLOR "\" >2nd Ring Counter Clockwise</span>", WACOM_BUTTON_POSITION_RIGHT); + print_label (cairo_context, tablet, "#LabelRing2CW", "<span foreground=\"" INACTIVE_COLOR "\" >2nd Ring Clockwise</span>", WACOM_BUTTON_POSITION_RIGHT); + } + /* Touch strips */ + if (libwacom_get_num_strips(tablet->device) > 0) { + print_label (cairo_context, tablet, "#LabelStripUp", "<span foreground=\"" INACTIVE_COLOR "\" >Strip Up</span>", WACOM_BUTTON_POSITION_LEFT); + print_label (cairo_context, tablet, "#LabelStripDown", "<span foreground=\"" INACTIVE_COLOR "\" >Strip Down</span>", WACOM_BUTTON_POSITION_LEFT); + } + if (libwacom_get_num_strips(tablet->device) > 1) { + print_label (cairo_context, tablet, "#LabelStrip2Up", "<span foreground=\"" INACTIVE_COLOR "\" >2nd Strip Up</span>", WACOM_BUTTON_POSITION_RIGHT); + print_label (cairo_context, tablet, "#LabelStrip2Down", "<span foreground=\"" INACTIVE_COLOR "\" >2nd Strip Down</span>", WACOM_BUTTON_POSITION_RIGHT); + } } static void @@ -192,10 +212,16 @@ update_tablet (Tablet *tablet) " xmlns:xi=\"http://www.w3.org/2001/XInclude\"\n" " width=\"", width, "\"\n" " height=\"", height, "\">\n" - " <style type=\"text/css\">\n" - " * {\n" - " stroke: ", STROKE_COLOR," !important;\n" - " fill: ", INACTIVE_COLOR," !important;\n" + " <style type=\"text/css\">\n", + " .Leader {\n" + " stroke-width: .5 !important;\n" + " stroke: ", INACTIVE_COLOR, ";\n" + " fill: none !important;\n" + " }\n", + " .Button {\n" + " stroke-width: 0.25;\n" + " stroke: ", INACTIVE_COLOR, ";\n" + " fill: ", INACTIVE_COLOR, ";\n" " }\n", NULL); g_free (width); @@ -206,25 +232,31 @@ update_tablet (Tablet *tablet) if (button == tablet->active_button) { data = g_strconcat (data, " .", class, " {\n" - " stroke: ", STROKE_COLOR," !important;\n" - " fill: ", button == tablet->active_button ? ACTIVE_COLOR : INACTIVE_COLOR, " !important;\n" + " stroke: ", ACTIVE_COLOR, " !important;\n" + " fill: ", ACTIVE_COLOR, " !important;\n" " }\n", NULL); } } - /* Hide the existing labels */ data = g_strconcat (data, + " .Leader {\n" + " fill: none !important;\n" + " }\n", " .Label {\n" - " stroke: none !important;\n" - " fill: ", BACK_COLOR, " !important;\n" + " stroke: none !important;\n" + " stroke-width: 0.1 !important;\n" + " opacity: .0 !important;\n" + " font-size: .1 !important;\n" + " fill: ", BACK_COLOR, " !important;\n" " }\n", " .TouchStrip,.TouchRing {\n" + " stroke-width: 0.1 !important;\n" " stroke: ", INACTIVE_COLOR," !important;\n" - " fill: ", DARK_COLOR, " !important;\n" + " fill: ", DARK_COLOR, " !important;\n" " }\n", " </style>\n" - " <xi:include href=\"", libwacom_get_layout_filename (tablet->device), "\"/>\n" + " <xi:include href=\"", libwacom_get_layout_filename (tablet->device), "\"/>\n" "</svg>", NULL); @@ -371,7 +403,7 @@ main (int argc, char **argv) g_signal_connect (tablet->widget, "expose-event", G_CALLBACK(on_expose_cb), tablet); g_signal_connect (tablet->widget, "delete-event", G_CALLBACK(on_delete_cb), tablet); - tablet->timeout = g_timeout_add(500 /* ms */, (GSourceFunc) on_timer_cb, tablet); + tablet->timeout = g_timeout_add(750 /* ms */, (GSourceFunc) on_timer_cb, tablet); gtk_widget_show (tablet->widget); -- 1.8.0
------------------------------------------------------------------------------ Keep yourself connected to Go Parallel: TUNE You got it built. Now make it sing. Tune shows you how. http://goparallel.sourceforge.net
_______________________________________________ Linuxwacom-devel mailing list Linuxwacom-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel