1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672
|
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
<!ENTITY gnomeversion "2.24">
<!ENTITY manrevision "2.24.0">
<!ENTITY date "September 2008">
<!ENTITY LEGAL SYSTEM "legal.xml">
<!ENTITY gad SYSTEM "gad.xml">
<!ENTITY gtest SYSTEM "gtest.xml">
]>
<?db.chunk.max_depth 4?>
<book id="index" lang="sv">
<title>GNOME:s utvecklarguide för hjälpmedelsteknik</title>
<bookinfo>
<abstract role="description">
<para>GNOME:s guide för hjälpmedelsteknik är för utvecklare som vill säkerställa att deras programmeringssträvanden är tillgängliga för största möjliga användarpublik. Denna guide täcker också många av kraven i avsnitt 508 i USA:s Rehabilitation Act.</para>
</abstract>
<copyright><year>2008</year> <holder>Vincent Alexander</holder></copyright>
<copyright><year>2001, 2002</year> <holder>Calum Benson, Brian Cameron, Bill Haneman, Padraig O'Briain, Sharon Snider</holder></copyright>
<publisher role="maintainer">
<publishername>Dokumentationsprojektet för GNOME</publishername>
</publisher>
<legalnotice id="legalnotice">
<para>Tillstånd att kopiera, distribuera och/eller modifiera detta dokument ges under villkoren i GNU Free Documentation License (GFDL), version 1.1 eller senare, utgivet av Free Software Foundation utan standardavsnitt och omslagstexter. Du kan hitta en kopia av GFDL <ulink type="help" url="ghelp:fdl"> här</ulink> eller i filen COPYING-DOCS som medföljer denna handbok.</para>
<para>Denna handbok utgör en av flera GNOME-handböcker som distribueras under villkoren i GFDL. Om du vill distribuera denna handbok separat från övriga handböcker kan du göra detta genom att lägga till en kopia av licensavtalet i handboken enligt instruktionerna i avsnitt 6 i licensavtalet.</para>
<para>Många av namnen som används av företag för att särskilja deras produkter och tjänster är registrerade varumärken. I de fall dessa namn förekommer i GNOME-dokumentation - och medlemmarna i GNOME-dokumentationsprojektet är medvetna om dessa varumärken - är de skrivna med versaler eller med inledande versal.</para>
<para>DOKUMENTET OCH MODIFIERADE VERSIONER AV DOKUMENTET TILLHANDAHÅLLS UNDER VILLKOREN I GNU FREE DOCUMENTATION LICENSE ENDAST UNDER FÖLJANDE FÖRUTSÄTTNINGAR: <orderedlist>
<listitem>
<para>DOKUMENTET TILLHANDAHÅLLS I "BEFINTLIGT SKICK" UTAN NÅGRA SOM HELST GARANTIER, VARE SIG UTTRYCKLIGA ELLER UNDERFÖRSTÅDDA, INKLUSIVE, MEN INTE BEGRÄNSAT TILL, GARANTIER ATT DOKUMENTET ELLER EN MODIFIERAD VERSION AV DOKUMENTET INTE INNEHÅLLER NÅGRA FELAKTIGHETER, ÄR SÄLJBART, ÄR LÄMPLIGT FÖR ETT VISST ÄNDAMÅL ELLER INTE STRIDER MOT LAG. HELA RISKEN VAD GÄLLER KVALITET, EXAKTHET OCH UTFÖRANDE AV DOKUMENTET OCH MODIFIERADE VERSIONER AV DOKUMENTET LIGGER HELT OCH HÅLLET PÅ DIG. OM ETT DOKUMENT ELLER EN MODIFIERAD VERSION AV ETT DOKUMENT SKULLE VISA SIG INNEHÅLLA FELAKTIGHETER I NÅGOT HÄNSEENDE ÄR DET DU (INTE DEN URSPRUNGLIGA SKRIBENTEN, FÖRFATTAREN ELLER NÅGON ANNAN MEDARBETARE) SOM FÅR STÅ FÖR ALLA EVENTUELLA KOSTNADER FÖR SERVICE, REPARATIONER ELLER KORRIGERINGAR. DENNA GARANTIFRISKRIVNING UTGÖR EN VÄSENTLIG DEL AV DETTA LICENSAVTAL. DETTA INNEBÄR ATT ALL ANVÄNDNING AV ETT DOKUMENT ELLER EN MODIFIERAD VERSION AV ETT DOKUMENT BEVILJAS ENDAST UNDER DENNA ANSVARSFRISKRIVNING;</para>
</listitem>
<listitem>
<para>UNDER INGA OMSTÄNDIGHETER ELLER INOM RAMEN FÖR NÅGON LAGSTIFTNING, OAVSETT OM DET GÄLLER KRÄNKNING (INKLUSIVE VÅRDSLÖSHET), KONTRAKT ELLER DYLIKT, SKA FÖRFATTAREN, DEN URSPRUNGLIGA SKRIBENTEN ELLER ANNAN MEDARBETARE ELLER ÅTERFÖRSÄLJARE AV DOKUMENTET ELLER AV EN MODIFIERAD VERSION AV DOKUMENTET ELLER NÅGON LEVERANTÖR TILL NÅGON AV NÄMNDA PARTER STÄLLAS ANSVARIG GENTEMOT NÅGON FÖR NÅGRA DIREKTA, INDIREKTA, SÄRSKILDA ELLER OFÖRUTSEDDA SKADOR ELLER FÖLJDSKADOR AV NÅGOT SLAG, INKLUSIVE, MEN INTE BEGRÄNSAT TILL, SKADOR BETRÄFFANDE FÖRLORAD GOODWILL, HINDER I ARBETET, DATORHAVERI ELLER NÅGRA ANDRA TÄNKBARA SKADOR ELLER FÖRLUSTER SOM KAN UPPKOMMA PÅ GRUND AV ELLER RELATERAT TILL ANVÄNDNINGEN AV DOKUMENTET ELLER MODIFIERADE VERSIONER AV DOKUMENTET, ÄVEN OM PART SKA HA BLIVIT INFORMERAD OM MÖJLIGHETEN TILL SÅDANA SKADOR.</para>
</listitem>
</orderedlist></para>
</legalnotice>
<authorgroup>
<author><firstname>Vincent</firstname> <surname>Alexander</surname> <affiliation> <orgname>Dokumentationsprojektet för GNOME</orgname> </affiliation></author>
<author><firstname>Calum</firstname> <surname>Benson</surname> <affiliation> <orgname>Dokumentationsprojektet för GNOME</orgname> </affiliation></author>
<author><firstname>Brian</firstname> <surname>Cameron</surname> <affiliation> <orgname>Dokumentationsprojektet för GNOME</orgname> </affiliation></author>
<author><firstname>Bill</firstname> <surname>Haneman</surname> <affiliation> <orgname>Dokumentationsprojektet för GNOME</orgname> </affiliation></author>
<author><firstname>Padraig</firstname> <surname>O'Briain</surname> <affiliation> <orgname>Dokumentationsprojektet för GNOME</orgname> </affiliation></author>
<author><firstname>Sharon</firstname> <surname>Snider</surname> <affiliation> <orgname>Dokumentationsprojektet för GNOME</orgname> </affiliation></author>
</authorgroup>
<revhistory>
<revision><revnumber> GNOME 2.24 Utvecklarguide för hjälpmedelsteknik v2.24.0 </revnumber> <date>September 2008</date> <revdescription>
<para role="author">Dokumentationsprojektet för GNOME</para>
<para role="publisher">Dokumentationsprojektet för GNOME</para>
</revdescription></revision>
<revision><revnumber> GNOME 2.24 Utvecklarguide för hjälpmedelsteknik v2.24.0 </revnumber> <date>September 2008</date> <revdescription>
<para role="author">Dokumentationsprojektet för GNOME</para>
<para role="publisher">Dokumentationsprojektet för GNOME</para>
</revdescription></revision>
</revhistory>
<releaseinfo>Den här handboken beskriver version 2.24 av GNOME-skrivbordet.</releaseinfo>
<legalnotice>
<title>Återkoppling</title>
<para>För att rapportera ett fel eller komma med ett förslag för GNOME-skrivbordet eller denna handbok, följ instruktionerna på <ulink type="help" url="ghelp:user-guide?feedback">återkopplingssidan för GNOME</ulink>.</para>
</legalnotice>
<othercredit class="translator">
<personname>
<firstname>Anders Jonsson</firstname>
</personname>
<email>anders.jonsson@norsjovallen.se</email>
</othercredit>
<copyright>
<year>2017</year>
<year>2018</year>
<holder>Anders Jonsson</holder>
</copyright>
</bookinfo>
<chapter id="gad" status="draft">
<title>Vad är tillgänglighet?</title>
<para>Tillgänglighet betyder att hjälpa personer som har funktionsnedsättningar med att delta i viktiga aktiviteter i livet. Detta inkluderar arbete samt utnyttjandet av tjänster, produkter och information. GNOME inkluderar bibliotek och ett stödramverk som låter personer med funktionsnedsättningar utnyttja all funktionalitet i GNOME:s användarmiljö.</para>
<para>Tillsammans med hjälpmedelsteknologier om så krävs - röstgränssnitt, skärmläsare, alternativa inmatningsenheter och så vidare - kan personer med bestående eller tillfälliga funktionsnedsättningar därför använda GNOME-skrivbordet samt dess program. Hjälpmedelsteknologier är också användbara för personer som använder datorer utanför hemmet eller kontoret. Om du till exempel sitter fast i trafiken skulle du kunna använda röstinmatning och uppläsning för att kontrollera din e-post.</para>
<para>Hjälpmedelsteknologier tar emot information från program genom Accessibility Toolkit-API:t (ATK), vilket du kan hitta i atk-modulen i GNOME-arkiven. Eftersom stöd för tillgänglighets-API:t är inbyggt i GNOME-komponenterna så bör ditt GNOME-program fungera hyfsat bra med hjälpmedelsteknologier utan något extra arbete från din sida. Till exempel kan hjälpmedelsteknologierna automatiskt läsa komponentetiketterna som du normalt skulle ställa in i ditt program i vilket fall (t.ex. med GTK-funktionsanrop så som <function>gtk_label_set_text()</function> eller <function>gtk_button_new_with_label()</function>). De kan också se om det finns någon text för en inforuta associerad med en komponent, och använda den för att beskriva komponenten för användaren.</para>
<para>Med lite extra ansträngning kan du dock få ditt program att fungera ännu smidigare med hjälpmedelsteknologier. Förutom att hjälpa enskilda användare så kommer det också att göra din produkt mer attraktiv för myndighets- och utbildningsmarknader, av vilka många enligt lag nu kräver att deras program ska vara tillgängliga.</para>
<section>
<title>Typer av funktionsnedsättning</title>
<para>Enbart i USA finns det uppskattningsvis 30 000 000 personer vars förmåga att använda datorer begränsas av design som inte är tillgänglig. Globalt har omkring 8% av personerna som använder internet något slags funktionshinder. Funktionshinder delas upp i dessa kategorier:</para>
<itemizedlist>
<listitem>
<para><emphasis>Synnedsättningar</emphasis> - dessa kan variera från dålig syn (inklusive dunkel eller suddig syn, extrem när- eller översynthet, färgblindhet, tunnelseende med flera) till fullständigt blindhet. Ett dåligt val av storlek och färg på text, samt uppgifter som kräver god öga-handkoordination (så som att flytta på musen) kan orsaka problem för dessa användare.</para>
</listitem>
<listitem>
<para><emphasis>Rörelsenedsättningar</emphasis> - användare med dålig muskelkontroll eller muskelsvaghet kan ha svårt att använda ett vanligt tangentbord eller en mus. Till exempel kan de kanske inte hålla ned två knappar samtidigt, eller så kan de ha större risk att trycka ned tangenter oavsiktligt.</para>
</listitem>
<listitem>
<para><emphasis>Hörselnedsättningar</emphasis> - dessa kan variera från att kunna höra vissa ljud men inte kunna särskilja talade ord, till dövhet. Program som uttrycker viktig information enbart genom ljud kommer att orsaka problem för dessa användare.</para>
</listitem>
<listitem>
<para><emphasis>Kognitiva nedsättningar och språknedsättningar</emphasis> - dessa kan variera från dyslexi till att ha svårigheter att komma ihåg saker, lösa problem eller att förstå och använda talat eller skrivet språk. Komplex eller inkonsekvent visning, eller olämpliga ordval kan göra datoranvändning svår för dessa användare.</para>
</listitem>
<listitem>
<para><emphasis>Krampsjukdomar</emphasis> - vissa ljus- eller ljudmönster kan orsaka epileptiska krampanfall hos mottagliga användare.</para>
</listitem>
</itemizedlist>
</section>
<section id="gad-how-it-works">
<title>Hur tillgänglighet fungerar i GNOME</title>
<para>Tillgänglighetsverktygslådan ATK (Accessibility Toolkit) beskriver en uppsättning gränssnitt som måste implementeras av grafiska användargränssnittskomponenter för att göra dem tillgängliga. Gränssnitten är oberoende av verktygslåda - implementationer kan skrivas för valfri komponentuppsättning, så som GTK, Motif eller Qt.</para>
<para>Implementationen för GTK-komponenterna görs via klassen GtkAccessible. Den är basklassen för hjälpmedelsimplementationer för underklasser till GtkWidget. Den är ett tunt omslag kring AtkObject, vilket lägger till funktionalitet för att associera en komponent med sitt tillgängliga objekt. De delar av ditt program som använder GTK-standardkomponenter kommer ha en grundläggande nivå av tillgänglighet, utan att du behöver ändra på ditt program alls.</para>
<para>De flesta hjälpmedelsteknologier som körs på andra skrivbord har historiskt funnit det nödvändigt att bibehålla en komplex modell vid sidan om skärmen av skrivbordsprogrammen, baserat på tjuvlyssnande på händelser i operativsystemet, användning av funktioner och API:er som inte har stöd i operativsystem och program, och andra tekniker som är ytterst oporterbara. Detta har gjort stöd för hjälpmedelsteknologier något ”sköra” samt högst beroende på operativsystem och program, till och med beroende på programversion. I kontrast till detta tillhandahålls på GNOME-skrivbordet all information som hjälpmedelsteknologier behöver av de körande programmen, via GNOME:s tillgänglighetsramverk, till ett verktygslådeoberoende tjänsteleverantörsgränssnitt (Service Provider Interface, SPI). SPI tillhandahåller ett sätt för UNIX-baserade hjälpmedelsteknologier, så som skärmläsare och skärmförstorare, att erhålla tillgänglighetsinformation från körande program via ett konsekvent, stabilt API, och kan eliminera behovet av en modell vid sidan om skärmen i många fall. Tillgänglighetsstöd för program är ”inbyggt” för programverktygslådor via verktygslådelämpliga API:er (till exempel, ATK för de flesta inhemska C-program och Java-tillgänglighets-API:t för Java-program), och exporteras till det allmänna ”AT-SPI”-gränssnittet via den relevanta ”bryggan” (se diagram nedan).</para>
<!--
<figure id="gad-architecture">
<title>GNOME Accessibility Architecture</title>
<mediaobject>
<imageobject>
<imagedata fileref="figures/GNOME_desktop_Accessibility.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>Diagram of GNOME's accessibility architecture</phrase>
</textobject>
</mediaobject>
</figure>
-->
<para>GNOME:s inbyggda tillgänglighetsstöd innebär att program som skapats med GNOME:s standardkomponenter får stöd för hjälpmedelsteknologier ”gratis”, under förutsättning att komponenterna inte används på ovanliga sätt som strider mot detta inbyggda stöd.</para>
<para>En gtk+/GNOME-komponent är tillgänglig om dess användning följer de allmänna tillgänglighetsriktlinjerna i resten av detta dokument, och implementerar de ATK-gränssnitt som är lämpliga för dess roll i användargränssnittet. ATK-implementationer tillhandahålls för ”standard”-komponenterna i GNOME-verktygslådan (d.v.s. gtk+- och GNOME-komponenter som inte är föråldrade), och i många fall kommer även nya komponenter som härletts trivialt från befintliga GTK+- eller GNOME-komponenter att ärva lämpligt tillgänglighetsstöd.</para>
<para>Även om GNOME:s inbyggda stöd för tillgänglighet tillhandahåller betydande funktionalitet utan några tillgänglighetsspecifika kodändringar från programmets sida, så kan program ofta förbättra standardbeskrivningarna som tillhandahålls för vissa av komponenterna, och skräddarsy dem efter komponentens specifika syfte i ditt program, via enkla anrop till ATK-metoder i programmet. Till exempel bör program för det mesta lägga till eller ändra textbeskrivningarna för dessa komponenter med lämpligt ATK-funktionsanrop, så att en hjälpmedelsteknologi kan beskriva deras syfte eller tillstånd för användaren. Se <link linkend="gad-coding-guidelines">Kodriktlinjer för att stödja tillgänglighet</link> för mer information.</para>
<para>Om ditt program använder anpassade komponenter kan du behöva utföra lite arbete för att exponera dessa komponenters egenskaper för hjälpmedelsteknologier. Se <link linkend="gad-custom">Göra anpassade komponenter tillgängliga</link> och <link linkend="gad-api-examples">Exempel som använder tillgänglighets-API:t</link> för mer information.</para>
<para>För ytterligare, djupgående information om GTK/GTK+, se <ulink url="https://developer.gnome.org/gtk3/">referenshandboken för GTK+</ulink>, den förlegade <ulink url="https://developer.gnome.org/gtk-tutorial/stable/">GTK+ 2.0-guiden</ulink> och den officiella <ulink url="https://developer.gnome.org/gtk3/stable/gtk-question-index.html">frågor och svar-sidan för GTK+</ulink>.</para>
</section>
<section id="dev-start">
<title>Snabbstart för utvecklare</title>
<para>Här är några vanliga startpunkter:</para>
<section id="dev-start-1">
<title>Hur kontrollerar jag om mitt program är tillgängligt eller inte?</title>
<para>För att börja direkt, se <link linkend="gad-overview">Göra ett GNOME-program tillgängligt - Överblick</link>. För att få ett perspektiv innan kodningen, se <link linkend="gad-ui-guidelines">Riktlinjer för användargränssnitt som stöder tillgänglighet</link> eller <link linkend="gad-coding-guidelines">Kodriktlinjer för att stödja tillgänglighet</link>. För en kontrollista över testposter efter designen, se <link linkend="gad-checklist">Kontrollista för användargränssnitt</link>.</para>
</section>
<section id="dev-start-2">
<title>Vad är de vanligaste fallgroparna?</title>
<para><link linkend="gad-checklist">Kontrollistan för användargränssnitt</link> täcker alla områden som ibland förbises i designfasen.</para>
</section>
<section id="dev-start-3">
<title>Hur gör jag vanliga ATK-saker?</title>
<para>En förkortad lista över vanliga ATK-anrop kan hittas <link linkend="gad-api">här</link>.</para>
</section>
<section id="dev-start-4">
<title>Hur gör jag mer komplexa ATK-saker?</title>
<para>Se <link linkend="gad-custom">Göra anpassade komponenter tillgängliga</link> och <link linkend="gad-api-examples">Exempel som använder tillgänglighets-API:t</link> för mer information.</para>
</section>
<section id="dev-start-5">
<title>Introduktion av ATK, AT-SPI och GTK+</title>
<screenshot>
<mediaobject><imageobject> <imagedata fileref="figures/gaa.jpg"/> </imageobject> <textobject> <phrase> GNOME:s tillgänglighetsarkitektur </phrase> </textobject></mediaobject>
</screenshot>
<para>ATK är verktygslådan som GNOME använder för att möjliggöra tillgänglighet för användare som behöver extra stöd för att använda sina datorer till fullo. ATK används av verktyg så som skärmläsare, skärmförstorare och inmatningsenheter för att tillåta en rik interaktion med skrivbordet på alternativa sätt. Se <ulink url="http://java-gnome.sourceforge.net/doc/api/4.1/org/gnome/atk/package-summary.html">ATK:s SourceForge-projekt</ulink> och <ulink url="https://developer.gnome.org/atk/stable/">ATK-biblioteket</ulink> för mer information.</para>
<para>AT-SPI är det primära tjänstegränssnittets enligt vilket hjälpmedelsteknologier efterfrågar och tar emot aviseringar från körande program. Det fullständiga API:t kan utforskas <ulink url="https://developer.gnome.org/at-spi-cspi/stable/">här</ulink>.</para>
<para>GTK+ är ett bibliotek för att skapa grafiska användargränssnitt. Det fungerar på många UNIX-liknande plattformar, Windows, och på rambuffertenheter. GTK+ är släppt under GNU Library General Public License (GNU LGPL), vilken tillåter flexibel licensiering av klientprogram. GTK+ har en C-baserad objektorienterad arkitektur som tillåter maximal flexibilitet. Bindningar för andra språk har skrivits, bland annat C++, Objective-C, Guile/Scheme, Perl, Python, TOM, Ada95, Free Pascal och Eiffel. Dess GtkAccessible-klass är basklassen för hjälpmedelsimplementationer för underklasser till GtkWidget. Den är ett tunt omslag kring AtkObject, vilket lägger till funktionalitet för att associera en komponent med sitt tillgängliga objekt.</para>
<para>För ytterligare, djupgående information om GTK/GTK+, se <ulink url="https://developer.gnome.org/gtk3/">referenshandboken för GTK+</ulink>, <ulink url="https://wiki.gnome.org/Accessibility/Documentation/GNOME2/AtkGuide/Gtk">GTK-avsnittet i ATK-Guiden</ulink>, den förlegade <ulink url="https://developer.gnome.org/gtk-tutorial/stable/">GTK+ 2.0-guiden</ulink> på GNOME:s webbplats och den officiella <ulink url="https://developer.gnome.org/gtk3/stable/gtk-question-index.html">frågor och svar-sidan för GTK+</ulink>.</para>
</section>
</section>
<section id="gad-overview">
<title>Göra ett GNOME-program tillgängligt - Överblick</title>
<para>Om ditt program endast använder GTK-standardkomponenter behöver du troligen göra lite eller ingenting för att få ditt program (någorlunda) tillgängligt. Men se upp för objekt i ditt grafiska användargränssnitt som inte har en textbeskrivning associerad med sig, så som grafiska knappar eller statusindikatorer som inte har etiketter eller inforutor.</para>
<para>Du kan troligen också förbättra standardbeskrivningarna som tillhandahålls för några av komponenterna, och skräddarsy dem efter komponentens specifika syfte i ditt program. Du bör lägga till eller ändra textbeskrivningarna för dessa komponenter med lämpligt ATK-funktionsanrop, så att en hjälpmedelsteknologi kan beskriva deras syfte eller tillstånd för användaren. Se <link linkend="gad-coding-guidelines">Kodriktlinjer för att stödja tillgänglighet</link> för mer information.</para>
<para>Om ditt program använder anpassade komponenter kan du behöva utföra lite arbete för att exponera dessa komponenters egenskaper för hjälpmedelsteknologier. Se <link linkend="gad-custom">Göra anpassade komponenter tillgängliga</link> och <link linkend="gad-api-examples">Exempel som använder tillgänglighets-API:t</link> för mer information.</para>
</section>
<section id="gad-coding-guidelines">
<title>Kodriktlinjer för att stödja tillgänglighet</title>
<para>Här är några saker du kan göra i din kod för att få ditt program att fungera så bra som möjligt med hjälpmedelsteknologier. (Du kan hitta en lista över saker att överväga då du designar ditt grafiska användargränssnitt i avsnittet <link linkend="gad-ui-guidelines">Riktlinjer för användargränssnitt som stöder tillgänglighet</link> senare i detta dokument):</para>
<itemizedlist>
<listitem>
<para>För komponenter som inte visar en kort sträng (så som en grafisk knapp), ange ett namn för den med <function>atk_object_set_name()</function>. Du kan vilja göra detta för knappar med bara bilder, paneler som tillhandahåller logiska grupperingar, textområden och så vidare.</para>
</listitem>
<listitem>
<para>Om du inte kan tillhandahålla en inforuta för en komponent, använd istället <function>atk_object_set_description()</function> för att tillhandahålla en beskrivning som hjälpmedelsteknologier kan ge användaren. För att till exempel tillhandahålla en tillgänglig beskrivning för en <guibutton>Stäng</guibutton>-knapp:</para>
<example>
<title>Tillhandahålla en tillgänglighetsbeskrivning för en GtkButton</title>
<programlisting>
{
AtkObject *obj;
obj = gtk_widget_get_accessible(button);
atk_object_set_description(obj,_("Stänger fönstret"));
}
</programlisting>
</example>
</listitem>
<listitem>
<para>Använd <function>atk_image_set_description()</function> för att tillhandahålla en textbeskrivning för alla bilder och ikoner i ditt program.</para>
</listitem>
<listitem>
<para>Om flera komponenter formar en logisk grupp, försök placera dem i en behållare.</para>
</listitem>
<listitem>
<para>Närhelst du har en etikett som beskriver en annan komponent, använd <function>atk_relation_set_add_relation()</function> så att hjälpmedelsteknologier kan hitta komponenten som etiketten är associerad med. (Om du associerar etiketten med komponenten med hjälp av <function>gtk_label_set_mnemonic_widget()</function> så genereras <constant>ATK_RELATION_LABEL_FOR</constant>-relationen automatiskt, så följande kod skulle inte vara nödvändig):</para>
<example>
<title>Relatera en GtkLabel till en GtkWidget</title>
<programlisting>
{
GtkWidget *widget;
GtkLabel *label;
AtkObject *atk_widget, *atk_label;
AtkRelationSet *relation_set;
AtkRelation *relation;
AtkObject *targets[1];
atk_widget = gtk_widget_get_accessible(widget);
atk_label = gtk_widget_get_accessible (GTK_WIDGET(label));
relation_set = atk_object_ref_relation_set (atk_label);
targets[0] = atk_widget;
relation = atk_relation_new(targets,1, ATK_RELATION_LABEL_FOR);
atk_relation_set_add(relation_set,relation);
g_object_unref(G_OBJECT(relation));
}
</programlisting>
</example>
</listitem>
<listitem>
<para>Om du skapar en anpassad komponent, säkerställ att den stöder tillgänglighet. Anpassade komponenter som är ättlingar till andra GTK-komponenter bör åsidosätta ärvd tillgänglighetsinformation där så är lämpligt. För mer information, se <link linkend="gad-custom">Göra anpassade komponenter tillgängliga</link>.</para>
</listitem>
<listitem>
<para>Förstör inte det som du får gratis! Om ditt grafiska användargränssnitt har en otillgänglig behållare så kan det hända att alla komponenter i den behållaren blir otillgängliga.</para>
</listitem>
</itemizedlist>
</section>
<section id="gad-api">
<title>Tillgänglighets-API:t</title>
<para>Här är några av de grundläggande API-anrop du kan behöva använda i ditt program för att säkerställa att det fungerar bra med hjälpmedelsteknologier. Det fullständiga tillgänglighets-API:t är omfattande, för att exempelvis låta dig skriva dina egna anpassade tillgängliga komponenter.</para>
<table frame="all">
<title>Ofta använda ATK-API-anrop</title>
<tgroup cols="2" align="left">
<thead>
<row>
<entry>API</entry>
<entry>Beskrivning</entry>
</row>
</thead>
<tbody>
<row>
<entry>
<para><function>AtkObject* gtk_widget_get_accessible (GtkWidget*)</function></para>
</entry>
<entry>
<para>Returnerar det tillgängliga objektet som beskriver den angivna GTK-komponenten till en hjälpmedelsteknologi.</para>
</entry>
</row>
<row>
<entry>
<para><function>void atk_object_set_name (AtkObject*, const gchar*)</function></para>
</entry>
<entry>
<para>Ställer in namnet för det tillgängliga objektet. Om objektet till exempel är en grafisk knapp som avslutar programmet då den trycks ned så kan namnet vara ”Avsluta”.</para>
</entry>
</row>
<row>
<entry>
<para><function>void atk_object_set_description (AtkObject*, const gchar*)</function></para>
</entry>
<entry>
<para>Ställer in textbeskrivningen för det tillgängliga objektet. Om objektet till exempel är en grafisk ”Stäng”-knapp så kan beskrivningen vara ”Stänger fönstret”.</para>
</entry>
</row>
<row>
<entry>
<para><function>AtkRelation* atk_relation_new (AtkObject**, gint, AtkRelationType)</function></para>
</entry>
<entry>
<para>Skapar en ny relation mellan den angivna nyckeln och den angivna listan över målobjekt. En relation indikerar vanligen till hjälpmedelsteknologin att en komponent är relaterad till en annan på något sätt. Till exempel att en viss GtkLabel-komponent är texten för en GtkTreeView i samma fönster.</para>
</entry>
</row>
<row>
<entry>
<para><function>void atk_image_set_description (AtkImage*, const gchar*)</function></para>
</entry>
<entry>
<para>Ställer in textbeskrivningen för det tillgängliga bildobjektet. Om objektet till exempel är en miniatyrbild av ett virtuellt skrivbord i ett panelminiprogram så kan beskrivningen vara ”Bild som visar fönsterplacering på skrivbord 1”.</para>
</entry>
</row>
</tbody>
</tgroup>
</table>
</section>
<section id="gad-api-examples">
<title>Exempel som använder tillgänglighets-API:t</title>
<para>Som nämnts tidigare bör det kräva liten eller ingen ansträngning för att göra ditt program tillgängligt om du använder GTK-komponentuppsättningen, eller något annat komponentbibliotek som implementerar ATK-gränssnitten. De två vanligaste sakerna som du kan behöva göra i detta fall är:</para>
<itemizedlist>
<listitem>
<para>tillhandahålla beskrivningar av några kontroller och bilder med <function>atk_object_set_description()</function> eller <function>atk_image_set_description():</function></para>
<example>
<title>Ställa in tillgänglighetsbeskrivningen för en knapp</title>
<programlisting>
{
AtkObject *obj;
obj = gtk_widget_get_accessible(button);
atk_object_set_description(obj,_("Öppnar dialogrutan Inställningar"));
}
</programlisting>
</example>
<para>
</para>
</listitem>
<listitem>
<para>Ange relationer mellan ovanliga grupperingar av komponenter med <function>atk_relation_new()</function> och <function>atk_relation_set_add()</function>:</para>
<example>
<title>Ange en tillgänglig relation mellan två kontroller</title>
<programlisting>
{
GtkWidget *widget;
GtkLabel *label;
AtkObject *atk_widget, *atk_label;
AtkRelationSet *relation_set;
AtkRelation *relation;
AtkObject *targets[1];
atk_widget = gtk_widget_get_accessible (widget);
atk_label = gtk_widget_get_accessible (GTK_WIDGET(label));
relation_set = atk_object_ref_relation_set (atk_label);
targets[0] = atk_widget;
relation = atk_relation_new(targets,1, ATK_RELATION_LABEL_FOR);
atk_relation_set_add(relation_set,relation);
g_object_unref(G_OBJECT(relation));
}
</programlisting>
</example>
</listitem>
</itemizedlist>
<para>Exemplen i resten av detta avsnitt är mest till för att ge dig en försmak av omfånget av ATK. De täcker tekniker som du kanske aldrig kommer behöva använda som en programutvecklare, men de kan vara av intresse om du skriver egna anpassade komponenter (se <link linkend="gad-custom">Göra anpassade komponenter tillgängliga</link>) eller om du vill skriva ett hjälpmedelsteknologiprogram.</para>
<section>
<title>Erhålla tillgänglighetsinformation från ett program</title>
<para>Ett program som önskar använda ATK-anrop kommer troligen behöva göra en (eller flera) av följande saker:</para>
<orderedlist>
<listitem>
<para>Skapa en händelseövervakare, till exempel med <function>atk_add_focus_tracker()</function>-funktionen:</para>
<programlisting>atk_add_focus_tracker (_my_focus_tracker);</programlisting>
<para>där <function>_my_focus_tracker()</function> är en funktion med denna prototyp:</para>
<programlisting>void _my_focus_tracker (AtkObject *aobject);</programlisting>
</listitem>
<listitem>
<para>Konfigurera en global händelselyssnare med atk_add_global_event_listener():</para>
<programlisting>
mouse_watcher_focus_id = atk_add_global_event_listener(_my_global_listener,"Gtk:GtkWidget:enter_notify_event");
</programlisting>
<para>där <function>_my_global_listener</function> har prototypen av en <type>GSignalEmissionHook</type> i Glib. Detta exempel skulle få <function>_my_global_listener()</function> att anropas närhelst en enter_notify_event-signal inträffar på ett <type>GtkWidget</type>-objekt.</para>
</listitem>
<listitem>
<para>Kom åt ATK-toppnivåobjektet med följande funktionsanrop.</para>
<programlisting>AtkObject *root_obj = atk_get_root();</programlisting>
<para>Detta returnerar ett <type>AtkObject</type> som innehåller alla toppnivåfönster i programmet som för närvarande körs. Användaren skulle sedan kunna navigera genom objekthierarkin genom att komma åt rotobjektets underordnade objekt, vilket motsvarar toppnivåfönstren.</para>
</listitem>
</orderedlist>
</section>
<section>
<title>Efterfråga ett <type>AtkObject</type>s gränssnitt</title>
<para>Då du har hittat det <type>AtkObject</type> som är associerat med ett objekt i programmet (t.ex. genom att använda <function>gtk_widget_get_accessible()</function>) så kan du få reda på vilka gränssnitt som det implementerar på olika sätt:</para>
<orderedlist>
<listitem>
<para>Använd de tillhandahållna <function>ATK_IS_…</function>-makrona, till exempel:</para>
<itemizedlist>
<listitem>
<para><function>ATK_IS_ACTION(atkobj)</function></para>
</listitem>
<listitem>
<para><function>ATK_IS_COMPONENT(atkobj)</function></para>
</listitem>
<listitem>
<para>o.s.v. (det finns en för varje gränssnitt)</para>
</listitem>
</itemizedlist>
<para>Om makrot returnerar <function>TRUE</function> kan gränssnittsanropen utan risk göras på det ATK-objektet.</para>
</listitem>
<listitem>
<para>Testar rollen för ett <type>AtkObject</type> genom att anropa <function>atk_object_get_role()</function>. Alla givna roller implementerar ett specifikt antal ATK-API:er.</para>
</listitem>
</orderedlist>
</section>
<section>
<title>Konfigurera en ATK-signalhanterare</title>
<para>Med signalen <constant>column_inserted</constant> som ett exempel:</para>
<programlisting>
table_column_inserted_id = g_signal_connect_closure_by_id (my_atk_obj,
g_signal_lookup("column_inserted", G_OBJECT_TYPE(my_atk_obj)), 0,
g_cclosure_new(G_CALLBACK (_my_table_column_inserted_func), NULL, NULL), FALSE);
</programlisting>
<para>Detta kommer att få <function>_my_table_column_inserted_func()</function> att anropas närhelst en column_inserted-signal sänds på <type>AtkObject</type>et <varname>my_atk_object</varname>.</para>
<para>Att ansluta till en signal är något annorlunda om signalen stöder detaljer. Signalen <constant>children_changed</constant> stöder detaljen <parameter>add</parameter>. För att ansluta till en signal då detaljen <parameter>add</parameter> också är angiven används denna teknik:</para>
<programlisting>
child_added_id = g_signal_connect_closure (my_atk_obj,"children_changed::add",
g_cclosure_new (G_CALLBACK(_my_children_changed_func), NULL, NULL), FALSE);
</programlisting>
<para>Detta kommer att få <function>_my_children_changed_func()</function> att anropas närhelst en <constant>children_changed</constant>-signal med detaljen <parameter>add</parameter> sänds på <type>AtkObject</type>et <varname>my_atk_obj</varname>.</para>
</section>
<section>
<title>Implementera ett ATK-objekt</title>
<section>
<title>Register</title>
<para>För detta exempel kommer vi att anta att det finns ett objekt kallat GTK_TYPE_MYTYPE. ATK-implementationen kommer att kallas <type>MYATKIMP_TYPE_MYTYPE</type>. En fabrik kommer att behövas vilken kommer att kallas <type>MYATKIMP_TYPE_MYTYPE_FACTORY</type>.</para>
<para>För att registrera en ATK-implementation för ett GTK-objekt måste dessa steg följas i modulens <function>gtk_module_init()</function>-funktion:</para>
<orderedlist>
<listitem>
<para>Kom åt standardregistret:</para>
<programlisting>
default_registry = atk_get_default_registry();
</programlisting>
</listitem>
<listitem><para>Registrera ATK-objektet i <function>gtk_module_init()</function>-funktionen för denna modul genom att göra detta funktionsanrop:</para>
<programlisting>
atk_registry_set_factory_type (default_registry, GTK_TYPE_MYTYPE,
MYATKIMP_TYPE_MYTYPE_FACTORY);
</programlisting>
</listitem>
</orderedlist>
<para>Detta kommer att registrera AtkObject-implementationen av <type>GTK_TYPE_MYTYPE</type> till <type>MYATKIMP_TYPE_MYTYPE_FACTORY</type>. Denna fabrik kommer att implementeras så att den vet hur objekt av typen <type>MYATKIMP_TYPE_MYTYPE</type> ska byggas.</para>
</section>
<section>
<title>Fabrik</title>
<para>Fabriken måste implementeras som underordnad klasstypen <type>ATK_TYPE_OBJECT_FACTORY</type> och måste implementera funktionen <function>create_accessible()</function>. Denna funktion måste skapa ett lämpligt <type>AtkObject</type>. En fabrik kan användas för att skapa mer än en typ av objekt, i vilket fall dess <function>create_accessible()</function>-funktion kommer behöva vara smart nog för att bygga och returnera rätt <type>AtkObject</type>.</para>
</section>
<section>
<title>ATK-implementation för ett specifikt objekt</title>
<para>Alla <type>GObject</type> implementerar en <function>get_type()</function>-funktion. Om vi använder exemplet ovan så skulle namnkonventionen för detta funktionsnamn vara <function>myatkimp_mytype_get_type()</function>.</para>
<para>I denna funktion anger du vilka gränssnitt som ditt objekt implementerar. Om följande logik skulle inkluderas i denna <function>get_type()</function>-funktion så skulle detta objekt implementera <type>ATK_TEXT</type>-gränssnittet:</para>
<example>
<title>Exempel på en <function>get_type()</function>-funktion</title>
<programlisting>
static const GInterfaceInfo atk_text_info =
{
(GInterfaceInitFunc) atk_text_interface_init,
(GInterfaceFinalizeFunc) NULL,
NULL
};
g_type_add_interface_static (type, ATK_TYPE_TEXT,
&atk_text_info);
</programlisting>
</example>
<para>Funktionen <function>atk_text_interface_init()</function>, som har följande prototyp, skulle behöva implementeras:</para>
<programlisting>
void atk_text_interface_init (AtkTextIface *iface);
</programlisting>
<para>Denna funktion skulle ansluta gränssnittets funktionsanrop till den specifika implementationen enligt följande:</para>
<example>
<title>Ansluta anpassade gränssnittsanrop till en AtkObject-implementation</title>
<programlisting>
void
atk_text_interface_init (AtkTextIface *iface)
{
g_return_if_fail (iface != NULL);
iface->get_text = myatkimp_mytype_get_text;
iface->get_character_at_offset = myatkimp_mytype_get_character_at_offset;
...
}
</programlisting>
</example>
<para>Då skulle funktionerna <function>myatkimp_mytype_get_text()</function>, <function>myatkimp_mytype_get_character_at_offset()</function> och resten av <type>ATK_TEXT</type>-gränssnittsfunktionerna behöva implementeras.</para>
</section>
<section>
<title><type>AtkObject</type>-implementation</title>
<para>Alla <type>AtkObject</type> är <type>GObject</type>, och alla <type>GObject</type> behöver ange <function>get_type()</function>-funktionen. Här är ett exempel som konfigurerar en klass- och instansinitierare. Denna <function>get_type()</function>-funktion anger också att objektet implementerar <type>ATK_TEXT</type> och anger att det överordnade objektet är <type>MYATKIMP_MYPARENTTYPE</type>.</para>
<!--
<example>
<title>Sample <function>get_type()</function> implementation</title>
<programlisting>
GType
myatkimp_mytype_get_type (void)
{
static GType type = 0;
if (!type)
{
static const GTypeInfo tinfo =
{
sizeof (GailLabelClass),
(GBaseInitFunc) NULL, /* base init */
(GBaseFinalizeFunc) NULL, /* base finalize */
(GClassInitFunc) myatkimp_mytype_class_init, /* class init */
(GClassFinalizeFunc) NULL, /* class finalize */
NULL, /* class data */
sizeof (GailLabel), /* instance size */
0, /* nb preallocs */
(GInstanceInitFunc) myatkimp_mytype_instance_init, /* instance init */
NULL /* value table */
};
/* Set up atk_text_info structure used below */
static const GInterfaceInfo atk_text_info =
{
(GInterfaceInitFunc) atk_text_interface_init,
(GInterfaceFinalizeFunc) NULL,
NULL
};
/* Set up typename and specify parent type */
type = g_type_register_static (MYATKIMP_MYPARENTTYPE,
"MyatkimpMytype", &tinfo, 0);
/* This class implements interface ATK_TYPE_TEXT */
g_type_add_interface_static (type, ATK_TYPE_TEXT,
&atk_text_info);
}
return type;
}
</programlisting>
</example>
-->
</section>
<section>
<title>Klass-/Instansinitierare</title>
<para>Du kommer behöva konfigurera en klassinitierare för ditt <type>GObject</type> om din <type>AtkObject</type>-implementation antingen:</para>
<orderedlist>
<listitem>
<para>Omdefinierar funktionsanrop som definierats av objektets överordnade objekt. Detta är typiskt nödvändigt då ett objekt behöver implementera en funktion som <function>atk_object_get_n_accessible_children()</function>. Detta är nödvändigt om objektet har underordnade objekt, men de inte är representerade av komponenter.</para>
<!--
<para>
For example, if your ATK implementation needs to over-ride the <type>AtkObject</type> function <function>get_name()</function>, then the class initializer would look like:
</para>
<example>
<title>Class initializer that overrides parent's <function>get_name()</function> function</title>
<programlisting>
myatkimp_mytype_class_init (GailLabelClass *klass)
{
AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
class->get_name = myatkimp_mytype_get_name;
}
</programlisting>
</example>
-->
</listitem>
<listitem><para>Kräver en <function>parent->init</function>-, <function>parent->notify_gtk</function>- eller <function>parent->finalize</function>-funktion.</para>
<!--
<para>
This example defines all three:
</para>
<example>
<title>Class initializer that defines its own <function>init()</function>, <function>notify_gtk()</function> and <function>finalize()</function> functions</title>
<programlisting>
static ParentObjectType *parent_class = NULL;
myatkimp_mytype_class_init (GailLabelClass *klass)
{
ParentObjectType *parent_class = (ParentObjectType*)klass;
/*
* Caching the parent_class is necessary if the init,
* notify_gtk, or finalize functions are set up.
*/
parent_class = g_type_class_ref (MYATKIMP_TYPE_PARENT);
parent_class->init = myatkimp_mytype_widget_init;
parent_class->notify_gtk = myatkimp_mytype_real_notify_gtk;
parent_class->finalize = myatkimp_mytype_finalize;
}
</programlisting>
</example>
-->
<orderedlist>
<listitem>
<para>parent->init</para>
<para>En <function>parent->init()</function>-funktion kan behövas om ATK-implementationen behöver göra något av följande:</para>
<orderedlist>
<listitem>
<para>Cacha alla data som erhålls från en bakomliggande GTK-komponent.</para>
</listitem>
<listitem>
<para>Lyssna på alla signaler från bakomliggande GTK-komponent.</para>
</listitem>
</orderedlist>
<!--
<para>
Here is an example of both:
</para>
<example>
<title>A custom <function>init()</function> function</title>
<programlisting>
void
gail_tree_view_widget_init (MyatkimpMytype *mytype,
GtkWidget *gtk_widget)
{
/* Make sure to call the parent's init function */
parent_class->init (widget, gtk_widget);
/* Cache a value in the ATK implementation */
mytype->cached_value = gtk_widget_function_call();
/* Listen to a signal */
gtk_signal_connect (GTK_OBJECT (gtk_widget),
"signal-type",
GTK_SIGNAL_FUNC (_myatkimp_mytype_signal_type),
NULL);
}
</programlisting>
</example>
<para>
In this example, if the specified <type>signal-type</type> signal were generated on the backing <varname>gtk_widget</varname>, then the <function>_myatkimp_mytype_signal_type()</function> function would be called.
</para>
-->
</listitem>
<listitem>
<para>parent->notify_gtk</para>
<para>Om ATK-implementationen behöver lyssna på några egenskapsaviseringar på det bakomliggande GTK-objektet, så kan en <function>parent->notify_gtk()</function>-funktion vara nödvändig. Till exempel:</para>
<example>
<title>En anpassad <function>notify_gtk()</function>-funktion</title>
<programlisting>
void
myatkimp_mytype_real_notify_gtk (GObject *obj,
GParamSpec *pspec)
{
GtkWidget *widget = GTK_WIDGET (obj);
AtkObject* atk_obj = gtk_widget_get_accessible (widget);
if (strcmp (pspec->name, "property-of-interest") == 0)
{
/* Hantera egenskapsändringen. */
}
else
{
parent_class->notify_gtk (obj, pspec);
}
}
</programlisting>
</example>
</listitem>
<listitem>
<para>parent->finalize</para>
<para>Om det är nödvändigt att frigöra data när en <type>GObject</type>-instans förstörs så behövs en <function>finalize()</function>-funktion för att frigöra minnet. Till exempel:</para>
<example>
<title>En anpassad <function>finalize()</function>-funktion</title>
<programlisting>
void
myatkimp_mytype_finalize (GObject *object)
{
MyAtkimpMyType *my_type = MYATKIMP_MYTYPE (object);
g_object_unref (my_type->cached_value);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
</programlisting>
</example>
</listitem>
</orderedlist>
</listitem>
</orderedlist>
</section>
</section>
</section>
<section id="gad-custom">
<title>Göra anpassade komponenter tillgängliga</title>
<para>Att lägga till ATK-stöd till din anpassade komponent kommer att säkerställa dess samarbete med tillgänglighetsinfrastrukturen. Detta är de allmänna steg som krävs:</para>
<itemizedlist>
<listitem>
<para>bedöm en anpassad komponent enligt de <link linkend="gad-ui-guidelines">riktlinjer för användargränssnitt</link> som är tillämpliga;</para>
</listitem>
<listitem>
<para>avgör vilka <ulink url="https://developer.gnome.org/atk/stable/interfaces.html">ATK-gränssnitt</ulink> som en anpassad komponent ska implementera enligt komponentens funktionsuppsättning och funktionalitet;</para>
</listitem>
<listitem>
<para>bedöm vilka <ulink url="https://developer.gnome.org/atk/stable/interfaces.html">ATK-gränssnitt</ulink> som kan ärvas från den överordnade komponentklassen;</para>
</listitem>
<listitem>
<para>implementera de lämpliga ATK-gränssnitten för komponentklassen på ett av två sätt:</para>
<itemizedlist>
<listitem>
<para>direkt av den anpassade komponenten, eller</para>
</listitem>
<listitem>
<para>i en <ulink url="https://developer.gnome.org/atk/stable/AtkObject.html"><type>AtkObject</type></ulink>-undertyp skapad av en ny <ulink url="https://developer.gnome.org/atk/stable/AtkObjectFactory.html"><type>AtkObjectFactory</type></ulink>-underklass</para>
</listitem>
</itemizedlist>
<para>Om den andra metoden används måste den lämpliga fabrikstypen registreras med <type>AtkObjectFactoryRegistry</type> vid körtid.</para>
</listitem>
</itemizedlist>
</section>
<section id="gad-ui-guidelines">
<title>Riktlinjer för användargränssnitt som stöder tillgänglighet</title>
<para>Då du designar ditt programs grafiska användargränssnitt finns det ett antal enkla riktlinjer som du bör följa för att säkerställa att det kan användas av en så bred publik som möjligt, vare sig detta är i kombination med hjälpmedelsteknologier eller inte. Bli inte lurad att tänka att detta bara är ett fall av att ”göra ditt grafiska användargränssnitt användbart för personer med funktionsnedsättningar”, och att du inte skulle behöva bry dig om du vet att ingen person med funktionsnedsättningar någonsin kommer att använda ditt program. Om du följer dessa riktlinjer kommer det förbättra den allmänna användbarheten för ditt program för alla som använder det - inklusive dig!</para>
<section>
<title>Allmänt</title>
<para>Vi blir alla frustrerade om vi inte kan hitta en funktion i ett program, eller gör ett misstag som det tar ett par minuter att återställa, om det är möjligt att återställa över huvud taget. Om du har någon typ av funktionsnedsättning är risken att förlusterna i form av ansträngning och tid kommer vara flera gånger värre. Att följa några få grundläggande riktlinjer kan hjälpa till att förhindra dessa sorters situationer för alla användare.</para>
<itemizedlist>
<listitem>
<para>Tillhandahåll Ångra för varje åtgärd som ändrar användarens data eller programmets inställningar. Tillhandahåll om möjligt mer än en nivå av Ångra och Gör om, och en historiklista för att tillåta förhandsgranskning av vilka åtgärder som kommer att ångras.</para>
</listitem>
<listitem>
<para>Tillhandahåll kommandon för att återställa standardinställningar. Om en specifik inställning skulle kunna göra programmet helt obrukbart för en person, t.ex. genom att göra typsnitten väldigt små, så vore det användbart att tillhandahålla ett alternativ för att återställa standardinställningarna utanför programmet självt. Detta skulle exempelvis kunna göras med en kommandoradsflagga.</para>
</listitem>
<listitem>
<para>Hjälp till att förhindra användare från att göra fel sak. Detta är särskilt viktigt för åtgärder som skulle kunna göras av misstag (t.ex musåtgärder) eller som inte lätt kan återställas (t.ex. att skriva över en fil). Överväg att använda bekräftelsedialoger eller att tvinga användaren att gå in i ett särskilt läge för att utföra potentiellt destruktiva åtgärder.</para>
</listitem>
<listitem>
<para>Minimera användares minnesbelastning. Låt till exempel användaren visa flera dokument samtidigt, och säkerställ att hjälp på nätet eller andra instruktioner kan förbli synliga medan de fortsätter med proceduren som beskrivs. Tillåt dem att kopiera all information som visas och att klistra in den var som helst där data kan matas in.</para>
</listitem>
<listitem>
<para>Tvinga inte användare att mata in skivor. Beroende på en användares specifika funktionsnedsättning kan de finna det svårt att fysiskt mata in eller byta ut en skiva, eller så kan de ha svårt att identifiera rätt skiva till att börja med. Om ditt program installeras från cd-rom, tillhandahåll ett alternativ för att kopiera alla filer som kommer att krävas till användarens hårddisk.</para>
</listitem>
<listitem>
<para>Placera inte ofta använda funktioner djupt nere i en menystruktur. Vare sig du använder en mus, tangentbord eller någon annan inmatningsenhet så är det bäst att undvika djupt nästlade menyobjekt. Förutom bördan av att komma ihåg var man kan hitta dem är de alltid svårare och mer tidsödande att komma åt.</para>
</listitem>
<listitem>
<para>Led inte användare genom onödiga steg. Till exempel är guider användbara för användare som har problem att hantera ett stort antal alternativ på en gång, men andra användare kan behöva minimera mängden tid eller tangenttryckningar de använder. Sådana användare tjänar på att kunna hoppa över onödiga steg eller gå direkt till det som de behöver. Överväg att tillhandahålla en <guibutton>Färdigställ</guibutton>-knapp i guider som hoppar direkt till slutet och antar standardsvar för de mellanliggande stegen. Om processen har många steg, överväg att fråga användarna i början om de vill gå igenom alla steg, eller bara de mest använda stegen.</para>
</listitem>
</itemizedlist>
</section>
<section>
<title>Tangentbordsnavigering</title>
<para>Ett väldesignat tangentbordsanvändargränssnitt spelar en nyckelroll när du designar tillgänglig programvara. Blinda användare kan navigera programvara mer effektivt med tangentbordet eftersom att använda musen beror på visuell återkoppling om muspekarens placering. Rörelsenedsättningar kan också förhindra en användare från att lyckas navigera med musen på grund av de finmotoriska färdigheter som krävs.</para>
<para>Det är därför viktigt att göra alla musåtgärder tillgängliga från tangentbordet, och inkludera tangentbordsåtkomst till alla verktygsfält, menyer, länkar och knappar. Varje funktion som ditt program tillhandahåller bör kunna kommas åt med bara tangentbordet. Göm din mus medan du testar ditt program om du behöver det!</para>
<para>Den mesta funktionaliteten bör vara enkel att göra tillgänglig genom att använda tangentbordsgenvägar, snabbtangenter och verktygslådans inbyggda navigeringsfunktioner. Åtgärder som exempelvis förlitar sig på dra och släpp kan dock kräva mer eftertanke.</para>
<itemizedlist>
<listitem>
<para>Tillhandahåll effektiv tangentbordsåtkomst till alla programfunktioner. Vissa användare kan kanske inte använda en mus, och många avancerade användare föredrar i vilket fall att använda tangentbordet. Vissa hjälpmedelsteknologiers inmatningsenheter kan även simulera tangentbordshändelser snarare än mushändelser. Då det är svårt eller rent av smärtsamt för vissa användare att skriva så är det viktigt att tillhandahålla ett tangentbordsgränssnitt som minimerar antalet tangenttryckningar som krävs för varje given uppgift.</para>
</listitem>
<listitem>
<para>Använd en logisk ordning för tangentbordsnavigering. När man navigerar runt i ett fönster med <keycap>Tabb</keycap>-tangenten bör tangentbordsfokus flytta mellan komponenterna enligt en förutsägbar ordning. I västerländska lokaler är detta normalt från vänster till höger samt uppifrån och ner.</para>
</listitem>
<listitem>
<para>Säkerställ en korrekt tabbordning för kontroller vars aktiverade tillstånd är beroende på tillstånd hos kryssrutor, radioknappar eller växlingsknappar. Då en sådan knapp är vald ska alla dess beroende kontroller aktiveras, och alla de beroende kontrollerna i andra knappar i gruppen ska inaktiveras. Då användaren väljer en kryssruta, radioknapp eller växlingsknapp som har beroende kontroller, ge inte automatiskt fokus till den första beroende kontrollen, utan lämna istället fokus på knappen.</para>
</listitem>
<listitem>
<para>Åsidosätt inte befintliga systemomfattande tillgänglighetsfunktioner. AccessX är till exempel en Xserver-utökning som har stöd sedan X11R6. Funktionen MouseKeys i denna utökning tillåter musrörelser och knapptryckningar att simuleras med det numeriska tangentbordet. Därför bör du inte lägga till funktioner till ditt program som endast kan kommas åt genom att trycka ned tangenter på det numeriska tangentbordet, då användare som förlitar sig på MouseKeys-funktionen inte kommer kunna använda dem.</para>
</listitem>
<listitem>
<para>Tillhandahåll mer än en metod för att utföra tangentbordsuppgifter där möjligt. Några användare kan finna vissa tangenter och tangentkombinationer lättare att använda än andra.</para>
</listitem>
<listitem>
<para>Tillhandahåll både tangentbords- och musåtkomst till funktioner där möjligt. Vissa användare kan kanske använda antingen musen eller tangentbordet, men inte båda.</para>
</listitem>
<listitem>
<para>Tilldela inte tangentkombinationer som är svåra att nå för vanligen använda tangentbordsåtgärder. Vissa personer kanske bara kan använda en hand på tangentbordet, så genvägar som enkelt kan användas med en hand är att föredra för vanliga åtgärder. I vilket fall kan att ofta behöva utföra långa eller svåra sträckningar öka muskelbelastningen för alla användare, vilket ökar risken för smärta eller skada.</para>
</listitem>
<listitem>
<para>Kräv inte upprepad användning av samtidiga knapptryckningar. Vissa användare kan bara trycka och hålla ner en tangent åt gången. Hjälpmedelsteknologier som AccessX kan tillåta användare att trycka ned knapparna en efter en snarare än samtidigt, men detta innebär förstås att åtgärden kommer ta längre tid för dem.</para>
</listitem>
<listitem>
<para>Säkerställ att all text som kan markeras med musen också kan markeras med tangentbordet. Detta är bekvämt för alla användare, men särskilt för dem som har problem med precisionskontroll av musen.</para>
</listitem>
<listitem>
<para>Säkerställ att objekt som kan storleksändras eller flyttas med ”dra och släpp” även kan storleksändras eller flyttas med tangentbordet. Exempelvis ikoner och fönster på skrivbordet. Där precisionsanpassning av storlek och placering är potentiellt viktigt, exempelvis former i ett diagram, kan du också överväga en dialogruta som du kan skriva in koordinater i, eller ett sätt att fästa fast objekt på ett användardefinierbart rutnät.</para>
</listitem>
<listitem>
<para>Använd inte allmänna navigeringsfunktioner för att utlösa åtgärder. Använd till exempel inte grundläggande tangentbordsnavigering med <keycap>Tabb</keycap> i en dialogruta för att aktivera några åtgärder som är associerade med en kontroll.</para>
</listitem>
<listitem>
<para>Visa tangentbordsstartade menyer, fönster och inforutor nära objektet de är relaterade till. I GNOME 2.0 kan användare anropa poppuppmenyer med <keycombo><keycap>Skift</keycap><keycap>F10</keycap></keycombo>, och inforutor med <keycombo><keycap>Skift</keycap><keycap>F1</keycap></keycombo>. Skym eller dölj dock inte fullständigt objektet som menyn eller inforutan hänvisar till.</para>
</listitem>
</itemizedlist>
</section>
<section>
<title>Musinteraktion</title>
<para>Kom ihåg att inte alla kan använda en mus med samma skicklighet, och att vissa användare kan ha svårighet att se eller följa muspekaren.</para>
<itemizedlist>
<listitem>
<para>Var inte beroende av inmatning från musknapp 2 eller 3. Så väl som att vara fysiskt svårare att klicka på så stöder vissa pekdon och många hjälpmedelsteknologier bara knapp 1. Vissa hjälpmedelsteknologier kanske inte emulerar musen över huvud taget, utan genererar tangentbordshändelser istället.</para>
</listitem>
<listitem>
<para>Tillåt alla musåtgärder att avbrytas. Att trycka ned <keycap>Esc</keycap>-tangenten bör avbryta alla pågående musåtgärder, så som att dra och släppa en fil i en filhanterare, eller att rita en form i ett ritprogram.</para>
</listitem>
<listitem>
<para>Tillhandahåll visuell återkoppling hela tiden under en dra och släpp-operation. Då musen passerar giltiga mål, färgmarkera dem och ändra muspekaren. Använd ”Inget släpp”-muspekaren då ogiltiga släppmål passeras. Se <link linkend="gad-mouse-examples">Musinteraktionsexempel</link>.</para>
</listitem>
<listitem>
<para>Teleportera inte muspekaren, och begränsa inte musrörelse till en del av skärmen. Detta kan störa hjälpmedelsteknologier, och är vanligen förvirrande även för användare som inte förlitar sig på hjälpmedelsteknologier.</para>
</listitem>
<listitem>
<para>Gör inte mål för musen för små. Allmänt bör musens mål vara minst storleken på det ”heta området” kring den storleksändringsbara fönsterkanten i den aktuella fönsterhanteraren/temat - tag i beaktande att en användare med nedsatt fingerfärdighet eller syn kan använda en fönsterhanterare med större områden än standardvärdet.</para>
</listitem>
</itemizedlist>
<section id="gad-mouse-examples">
<title>Musinteraktionsexempel</title>
<figure>
<title>Exempel på ”inget släpp”-pekare från CDE/Motif</title>
<mediaobject><imageobject> <imagedata fileref="figures/nodrop.png" format="PNG"/> </imageobject> <textobject> <phrase>Exempel på en ”ogiltigt släppmål”-pekarform</phrase> </textobject></mediaobject>
</figure>
</section>
</section>
<section>
<title>Grafiska element</title>
<para>Tillhandahåll alternativ för att anpassa presentationen av alla viktiga grafiska element i ditt program. Detta kommer göra det lättare för personer med visuella eller kognitiva nedsättningar att använda det.</para>
<itemizedlist>
<listitem>
<para>Hårdkoda inte grafiska attribut så som tjocklek för linjer, kanter och skuggor. Dessa element bör idealiskt läsas från GTK- eller fönsterhanterartemat. Om detta inte är möjligt, tillhandahåll alternativ inuti ditt program för att ändra dem.</para>
</listitem>
<listitem>
<para>Tillhandahåll beskrivande namn för alla gränssnittskomponenter. GTK tillhandahåller standardtillgänglighetsbeskrivningar för många GTK-komponenter, men du kommer fortfarande att behöva lägga till egna i vissa fall, så som för komponenter som använder grafik istället för text (exempelvis en färgruta i en färgpalett, eller en ikon utan en etikett). Överväg att åsidosätta standardvärdena med mer hjälpsamma eller programspecifika beskrivningar då det är möjligt.</para>
</listitem>
<listitem>
<para>Tillåt grafiska element med flera färger (t.ex verktygsfältsikoner) att visas bara monokromt om möjligt. Dessa monokroma bilder bör visas i systemets förgrunds- och bakgrundsfärger, vilka användaren har valt själv (genom deras val av GTK-tema) för maximal läsbarhet.</para>
</listitem>
<listitem>
<para>Gör interaktiva grafiska användargränssnittselement lätta att identifiera. Tvinga exempelvis inte användaren att hovra över ett objekt för att avgöra om det är klickbart eller inte. Lämna tillräckligt utrymme mellan objekt och avgränsa tydligt objektkanter. Visa inte grafiska användargränssnittselement som är vackra men inte tillför något, om du inte också tillhandahåller ett alternativ för att slå av dem.</para>
</listitem>
<listitem>
<para>Tillhandahåll ett alternativ för att dölja grafik som inte meddelar väsentlig information. Grafiska bilder kan vara distraherande för användare med vissa kognitiva nedsättningar. Ikonerna i GNOME-fotmenyn kan till exempel slås av medan menyerna förblir fullt funktionella.</para>
</listitem>
</itemizedlist>
</section>
<section>
<title>Typsnitt och text</title>
<para>Även för en användare med full syn så tillhandahåller textutmatning majoriteten av information och återkoppling i de flesta program. Det är därför avgörande att välja och placera text noggrant på skärmen, och lämna valet av typsnitt och storlek till användaren för att säkerställa att personer med synnedsättningar också kan använda ditt program effektivt.</para>
<itemizedlist>
<listitem>
<para>Hårdkoda inte stilar och storlekar för typsnitt. Användaren bör kunna justera alla storlekar och typsnitt. Om du av någon anledning inte kan erbjuda denna funktionalitet så bör du ändå aldrig hårdkoda typsnittsstorlekar mindre är 10 punkter.</para>
</listitem>
<listitem>
<para>Tillhandahåll alternativ för att slå av grafiska bakgrunder och ”vattenstämplar” bakom text. Sådana bilder stör kontrasten mellan texten och dess bakgrund, vilket kan orsaka svårighet för användare med synnedsättningar.</para>
</listitem>
<listitem>
<para>Ge objekt etiketter med namn som är förståeliga då de ses utan sammanhang. Användare som förlitar sig på skärmläsare eller liknande hjälpmedelsteknologier kommer inte nödvändigtvis att omedelbart förstå relationen mellan en kontroll och de som finns omkring den.</para>
</listitem>
<listitem>
<para>Använd inte samma etikett mer än en gång i samma fönster. Om du använder samma etikett i olika fönster är det till hjälp om det betyder samma sak i båda fönstren. Använd inte heller etiketter som stavas olika men låter likadant, t.ex. ”Read” och ”Red” då detta kan vara förvirrande för användare som förlitar sig på skärmläsare.</para>
</listitem>
<listitem>
<para>Placera etiketter konsekvent i hela ditt program. Detta betyder vanligen direkt under stora ikoner, direkt till höger om små ikoner, och direkt ovanför eller till vänster om andra kontroller. Se <link linkend="gad-font-examples">Exempel på typsnitt och text</link>.</para>
</listitem>
<listitem>
<para>Då du använder statisk text för att etikettera en kontroll, avsluta etiketten med ett kolon. Till exempel <guilabel>Användarnamn:</guilabel> för att etikettera ett textfält som användaren ska skriva sitt användarnamn i. Detta hjälper till att identifiera det som en kontrolls etikett snarare än ett oberoende textobjekt.</para>
</listitem>
<listitem>
<para>Då du använder statisk text för att etikettera en kontroll, säkerställ att etiketten är direkt före kontrollen i tabbordningen. Detta kommer säkerställa att snabbtangenten (det understrukna tecknet) du tilldelar till etiketten kommer att flytta fokus till eller aktivera rätt kontroll när den trycks ned.</para>
</listitem>
<listitem>
<para>Tillhandahåll alternativ till WYSIWYG (What you see is what you get, d.v.s. att det slutgiltiga resultatet hela tiden ses under redigering). Vissa användare kan exempelvis behöva skriva ut text med ett litet typsnitt men redigera den med ett större skärmtypsnitt. Möjliga alternativ inkluderar att visa all text med samma typsnitt och storlek (båda valda av användaren); ett ”radbryt-till-fönster”-alternativ som låter dig läsa all text i ett fönster utan att rulla horisontellt; en enkolumnsvy som visar fönstrets innehåll i en enda kolumn även om det kommer skrivas ut i flera kolumner; och en textvy, där grafik visas som platshållare eller textbeskrivningar. Om programmet har paneler med underordnade kontroller, överväg att tillåta panelerna att storleksändras tillsammans med det överordnade fönstret.</para>
</listitem>
</itemizedlist>
<section id="gad-font-examples">
<title>Exempel på typsnitt och text</title>
<figure id="label-placement-example">
<title>Korrekt etikettplacering för diverse grafiska gränssnittselement</title>
<informaltable frame="all">
<tgroup cols="3" align="center">
<tbody>
<row>
<entry valign="middle"><mediaobject>
<imageobject>
<imagedata fileref="figures/label_above.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>List control with label above</phrase>
</textobject>
</mediaobject> Listkontroll med etikett ovanför</entry>
<entry valign="middle"><mediaobject>
<imageobject>
<imagedata fileref="figures/label_below.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>Large file manager icon with label underneath</phrase>
</textobject>
</mediaobject> Stor filhanterarikon med etikett under</entry>
<entry valign="middle"><mediaobject>
<imageobject>
<imagedata fileref="figures/label_right.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>Small toolbar icon with label to its right</phrase>
</textobject>
</mediaobject> Liten verktygsfältsikon med etikett till höger</entry>
<entry valign="middle"><mediaobject>
<imageobject>
<imagedata fileref="figures/label_left.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>Spinbox control with label to its left</phrase>
</textobject>
</mediaobject> Stegningsruta med etikett till vänster</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</figure>
</section>
</section>
<section>
<title>Färg och kontrast</title>
<para>Dåligt färgval på skärmen kan orsaka problem för användare med färgblindhet (för vilka nyans är viktigt) eller med nedsatt syn (för vilka ljusstyrka/kontrast är viktigt). Allmänt bör du tillåta användaren att anpassa färgerna i alla delar av ditt program som meddelar viktig information.</para>
<para>Användare med synnedsättningar behöver ofta en hög kontrastnivå mellan bakgrunden och textfärger. Ofta används en svart bakgrund och vit text för att förhindra bakgrunden från att ”blöda”. Dessa inställningar är avgörande för användare med synnedsättningar.</para>
<itemizedlist>
<listitem>
<para>Hårdkoda inte programfärger. Vissa användare behöver använda vissa färgkombinationer och kontrastnivåer för att bekvämt kunna läsa skärmen. Därför bör alla huvudfärger du använder i ditt GNOME-program tas från GTK-temat, så att användaren kan ställa in temat för alla sina program till något läsbart bara genom att ändra temat. Om du av någon anledning behöver använda färger som inte är tillgängliga i temat, säkerställ att de går att anpassa i programmet självt.</para>
</listitem>
<listitem>
<para>Använd inte färg som det enda sättet för att skilja informationsobjekt åt. All sådan information bör tillhandahållas med minst en annan metod, så som form, position eller textbeskrivning. Se <link linkend="gad-color-examples">Exempel på färg och kontrast</link>.</para>
</listitem>
<listitem>
<para>Stöd alla GNOME-temana för hög kontrast. Säkerställ att då ett av dessa teman väljs så dyker all text i ditt program upp med hög kontrast i de förgrunds- och bakgrundsfärger som angivits av temat.</para>
</listitem>
<listitem>
<para>Säkerställ att ditt program inte är beroende av ett specifikt högkontrasttema. Testa det med olika högkontrastteman för att säkerställa att ditt program respekterar inställningarna.</para>
</listitem>
</itemizedlist>
<section id="gad-color-examples">
<title>Exempel på färg och kontrast</title>
<example>
<title>Exempel som illustrerar onödig användning av färg</title>
<informaltable frame="all">
<tgroup cols="2">
<tbody>
<row>
<entry valign="middle">
<mediaobject><imageobject> <imagedata fileref="figures/color_only.png" format="PNG"/> </imageobject> <textobject> <phrase>Exempel som visar ändringar i aktiekurs bara med färg</phrase> </textobject></mediaobject>
</entry>
<entry>Denna visning skulle kunna orsaka problem för en användare med röd-grön färgblindhet (färgblindhet drabbar så många som 1 av 7 män i vissa delar av världen). Avsaknaden av kontrast mellan den röda texten och den svarta bakgrunden skulle också göra det svårt att läsa för en användare med nedsatt syn, till och med om en skärmförstorare används.</entry>
</row>
<row>
<entry valign="middle">
<mediaobject><imageobject> <imagedata fileref="figures/color_and_arrows.png" format="PNG"/> </imageobject> <textobject> <phrase>Exempel som visar ändringar i aktiekurs både med färg och pilar</phrase> </textobject></mediaobject>
</entry>
<entry>Denna visning färstärker färgkodningen med pilar för att visa hur aktiepriset ändras, och använder mörkare nyanser av grön och röd på en ljusare bakgrund för att tillhandahålla högre kontrast. Detta behöver inte vara standardfärgschemat om tester har visat att det var för distraherande för de flesta användarna, men det borde vara möjligt att anpassa det på detta sätt antingen genom teman eller programmets dialogruta för <guilabel>Inställningar</guilabel>.</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</example>
</section>
</section>
<section>
<title>Förstoring</title>
<para>Många användare, även de som inte har synsvårigheter, drar nytta av förstoring av text och grafik. Utan förstoring kan dock en användare med synsvårigheter kanske inte få tillgång till och använda programmet över huvud taget.</para>
<itemizedlist>
<listitem>
<para>Tillhandahåll förmågan för användaren att förstora arbetsytan.</para>
</listitem>
<listitem>
<para>Tillhandahåll alternativ i programmet för att skala arbetsytan. Användare behöver ett alternativ för att förstora arbetsytan 150% till 400% eller mer. Testa programmet för att bekräfta att objektet du visar inte påverkas av att ändra förstoringsinställningarna.</para>
</listitem>
</itemizedlist>
</section>
<section>
<title>Ljud</title>
<para>Personer som hör dåligt, samt de som arbetar med sin dators ljud avslaget, kommer att ha en nackdel om ditt program förlitar sig på ljud för att meddela information. Se i allmänhet till att användaren kan få hörbar information meddelad på andra sätt.</para>
<itemizedlist>
<listitem>
<para>Anta inte att en användare kommer att höra ljudinformation. Detta gäller lika mycket användare med trasiga ljudkort som det gör de som har hörselnedsättningar!</para>
</listitem>
<listitem>
<para>Använd inte ljud som det enda sättet för att meddela information. Ge användaren alternativet att få all ljudinformation tillhandahållen även på ett visuellt sätt. Detta inkluderar att tillhandahålla undertexter eller transkription för alla viktiga talade ljudklipp.</para>
</listitem>
<listitem>
<para>Tillåt användare att konfigurera frekvens och volym på alla varningspip och andra ljud. Detta inkluderar att kunna slå av ljud fullständigt.</para>
</listitem>
</itemizedlist>
</section>
<section>
<title>Animering</title>
<para>Använt sparsamt kan animering vara användbart för att dra uppmärksamheten till viktig information i ditt program - och det kan även se coolt ut. Det kan dock vara problematiskt för vissa användare, så till att de kan slå av det.</para>
<itemizedlist>
<listitem>
<para>Använd inte blixtrande eller blinkande element som har en frekvens högre än 2 Hz och lägre än 55 Hz. Detta inkluderar text så väl som grafiska objekt. Allt i detta frekvensintervall kan orsaka specifika problem för användare som är mottagliga för visuellt inducerade kramper. Observera dock att det inte finns någon ”säker” frekvens. Om blixtrande är nödvändigt bör du använda systemets blinkfrekvens för markören (vilken själv bör vara anpassningsbar), eller tillåta användare att konfigurera frekvensen själva.</para>
</listitem>
<listitem>
<para>Blixtra eller blinka inte stora områden på skärmen. Små områden har mycket mindre risk att utlösa kramper hos de som är mottagliga för sådana.</para>
</listitem>
<listitem>
<para>Gör all animering valfri. Den animerade informationen bör vara tillgänglig i åtminstone ett icke animerat format, då användaren så önskar.</para>
</listitem>
</itemizedlist>
</section>
<section>
<title>Tangentbordsfokus</title>
<para>Att visa platsen för tangentbordsfokus tydligt vid varje tidpunkt är viktigt, både för användare med synnedsättningar såväl som för avancerade användare som föredrar att använda tangentbordet snarare än musen. Det ska aldrig finnas någon förvirring över vilken kontroll på skrivbordet som har fokus vid ett givet tillfälle. Du borde kunna lämna din dator med fokus på vilken komponent som helst i ditt program, sedan gå bort och ringa din partner eller rasta hunden tills du har glömt vilken komponent du lämnade den på. När du återvänder bör du direkt kunna säga vilken komponent det var.</para>
<para>En indikator för visuellt fokus är en ljudrepresentation av markörpositionen relativt till de andra objekten på skrivbordet. Denna låter användaren gå runt bland objekt interaktivt medan fokus ändras. Det visuella fokuset måste exponeras programmatiskt till hjälpmedelsteknologier. Observera att i de flesta fall hanteras detta automatiskt av ATK, utan att du behöver göra något extra arbete. Du kommer dock behöva vara medveten om detta krav när du exempelvis skriver dina egna anpassade komponenter.</para>
<itemizedlist>
<listitem>
<para>Börja fokus vid den mest använda kontrollen. Om ingen kontroll i ett fönster kan bedömas vara ”mest” användbar, börja med fokus på den första kontrollen i fönstret då det fönstret öppnas. Fokus bör inte startas på knapparna <guilabel>OK</guilabel> eller <guilabel>Avbryt</guilabel> för en dialogruta även om det är de mest använda kontrollerna, då de alltid kan aktiveras omedelbart genom att trycka ned <keycap>Retur</keycap> eller <keycap>Escape</keycap>.</para>
</listitem>
<listitem>
<para>Visa aktuellt inmatningsfokus tydligt hela tiden. Kom ihåg att det i kontroller som inkluderar ett rullningselement inte alltid är tillräckligt att färgmarkera bara det markerade elementet i rullningsområdet, då det kanske inte är synligt. Se <link linkend="gad-focus-examples">Tangentbordsfokusexempel</link>.</para>
</listitem>
<listitem>
<para>Visa inmatningsfokus bara i det aktiva fönstret. Dölj alla primära indikatorer för visuellt fokus i fönster som inte har fokus och aktivering. Om ett enda fönster har separata paneler bör bara en panel ha fokusindikatorn, och fokusindikatorer bör vara dolda i alla andra paneler. Om det är viktigt att fortsätta visa vilket objekt som exempelvis är markerat i en ofokuserad lista, använd en sekundär fokusindikator. Se <link linkend="gad-focus-examples">Tangentbordsfokusexempel</link>.</para>
</listitem>
<listitem>
<para>Tillhandahåll lämplig återkoppling då användaren försöker navigera förbi slutet av en grupp med relaterade objekt. Vid navigering i en lista är det ofta att föredra att avbryta med ljudåterkoppling över att flytta fokus tillbaka till det första objektet i listan. I annat fall kanske användare som är blinda eller har nedsatt syn inte inser att de har återvänt till början. I fallet med en textsökning i ett dokument kan en dialogruta poppa upp för att indikera att dokumentets slut har nåtts, och fråga om du vill återuppta sökningen i början på dokumentet.</para>
</listitem>
<listitem>
<para>Spela systemets standardvarningssignal (ljud eller visuell) då användaren trycker ned en olämplig knapp, eller då en navigeringstangent inte kan flytta fokus. Exempelvis då fokus är på det första tecknet i ett textfält och användaren trycker ned vänsterpil, eller då användaren försöker utföra flera markeringar i en enmarkeringsdialog. Observera att användare med hörselnedsättningar bör kunna konfigurera en systemomfattande visuell motsvarighet till standardvarningsljudet.)</para>
</listitem>
</itemizedlist>
<section id="gad-focus-examples">
<title>Tangentbordsfokusexempel</title>
<example><title>Exempel som illustrerar behovet av att tydligt visa fokus</title>
<informaltable frame="all">
<tgroup cols="2">
<tbody>
<row>
<entry valign="middle">
<mediaobject><imageobject> <imagedata fileref="figures/badfocus1.png" format="PNG"/> </imageobject> <textobject> <phrase>Det fokuserade objektet i detta fönster kan inte ses för att det har rullats utanför skärmen</phrase> </textobject></mediaobject>
</entry>
<entry>En av kontrollerna i detta fönster har fokus, men det är omöjligt att avgöra vilken…</entry>
</row>
<row>
<entry valign="middle">
<mediaobject><imageobject> <imagedata fileref="figures/badfocus2.png" format="PNG"/> </imageobject> <textobject> <phrase>Det fokuserade objektet i listan har blivit synligt genom att rulla genom listan</phrase> </textobject></mediaobject>
</entry>
<entry>…till du rullar i listan vilket avslöjar det av dess objekt som för närvarande är markerat.</entry>
</row>
<row>
<entry valign="middle">
<mediaobject><imageobject> <imagedata fileref="figures/goodfocus.png" format="PNG"/> </imageobject> <textobject> <phrase>Listkontrollen i detta exempel har en enfärgad kant som indikerar fokus, oavsett om dess markerade post är synlig för tillfället eller inte</phrase> </textobject></mediaobject>
</entry>
<entry>Om listkontrollen själv ges en ”fokuserad” kant, så är det lätt att avgöra att den har fokus även då det för närvarande markerade objektet inte är synligt.</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</example>
<example>
<title>Exempel som illustrerar användning av sekundärt fokus</title>
<informaltable frame="all">
<tgroup cols="2">
<tbody>
<row>
<entry valign="middle">
<mediaobject><imageobject> <imagedata fileref="figures/badfocus3.png" format="PNG"/> </imageobject> <textobject> <phrase>Fönster med delad panel i vilket båda panelerna verkar ha fokus</phrase> </textobject></mediaobject>
</entry>
<entry>I detta exempel är det omöjligt att avgöra vilken av de två panelerna som har tangentbordsfokus bara genom att titta på dem.</entry>
</row>
<row>
<entry valign="middle">
<mediaobject><imageobject> <imagedata fileref="figures/goodfocus3.png" format="PNG"/> </imageobject> <textobject> <phrase>Fönster med delad panel i vilket sekundär färgmarkering används för att visa vilken panel som har fokus</phrase> </textobject></mediaobject>
</entry>
<entry>Genom att använda en sekundär färg för färgmarkering i den inaktiva panelen är det omedelbart uppenbart att trädkontrollen har fokus här…</entry>
</row>
<row>
<entry valign="middle">
<mediaobject><imageobject> <imagedata fileref="figures/goodfocus2.png" format="PNG"/> </imageobject> <textobject> <phrase>Fönster med delad panel i vilket sekundär färgmarkering används för att visa vilken panel som har fokus</phrase> </textobject></mediaobject>
</entry>
<entry>…och att listkontrollen har fokus här.</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</example>
</section>
</section>
<section>
<title>Timing</title>
<para>Gränssnitt i vilka saker dyker upp, försvinner eller inträffar enligt någon hårdkodad tidsgräns är ofta ett hinder för tillgänglighet. Vissa användare kan läsa, skriva eller reagera väldigt långsamt i jämförelse med andra. Om information som de behöver har försvunnit innan de är klara med den, eller döljs av att annan information poppar upp vilket de inte uttryckligen efterfrågat, så kommer ditt program att bli väldigt frustrerande eller till och med omöjligt att använda.</para>
<itemizedlist>
<listitem>
<para>Hårdkoda inte tidsgränser eller andra tidsbaserade funktioner. Exempel inkluderar automatisk rullning då ett objekt dras mot kanten av ett fönster, att hålla ned en knapp i en rullningslist, eller att automatiskt expandera en trädnod då ett objekt dras över den och hålls där ett kort tag. Dessa bör antingen vara anpassningsbara i programmet, GNOME-kontrollpanelen, eller i värsta fall, manuellt redigerbara från kommandoraden genom en konfigurationsfil eller GConf-post.</para>
</listitem>
<listitem>
<para>Visa eller dölj inte information tillfälligt beroende på muspekarens rörelse. (Undantag: funktioner som systemet tillhandahåller, så som inforutor, vilka användaren kan konfigurera på en systemomfattande nivå). om du måste tillhandahålla sådana funktioner, gör dem valfria så att användare kan slå av dem då ett skärmgranskningsverktyg finns installerat.</para>
</listitem>
</itemizedlist>
</section>
<section>
<title>Dokumentation</title>
<para>Personer med funktionsnedsättningar kan inte använda programmet effektivt om de inte har tillgång till de handböcker och hjälpfiler som krävs. Av särskild vikt är tangentbordsnavigering då detta är det enda sätt på vilket många användare kan navigera programmet.</para>
<itemizedlist>
<listitem>
<para>Tillhandahåll all dokumentation i ett tillgängligt format. ASCII-text och HTML är båda utmärkta format för hjälpmedelsteknologier.</para>
</listitem>
<listitem>
<para>Tillhandahåll alternativa textbeskrivningar för all grafik i dokumentationen.</para>
</listitem>
<listitem>
<para>Dokumentera alla ditt programs tillgänglighetsfunktioner. Tangentbordsnavigering och genvägar är särskilt viktiga att dokumentera. Inkludera ett tillgänglighetsavsnitt i din dokumentation, där information om alla tillgänglighetsfunktionerna kan hittas.</para>
</listitem>
</itemizedlist>
</section>
</section>
</chapter>
<chapter id="gtest" status="draft">
<title>Test</title>
<para>Det finns flera granskningspunkter att ta i beaktande innan ett program kan förklaras vara tillgängligt. Under utvecklandet kan du vilja överväga automatiserade testtekniker. Exempelvis kan <ulink url="http://ldtp.freedesktop.org/">LDTP</ulink> komplementera din plan för automatiserade tester.</para>
<para>Detta avsnitt beskriver ett antal test du kan utföra manuellt på ett program för att testa dess tillgänglighet. Att få godkänt på alla tester betyder inte nödvändigtvis att programmet är fullständigt tillgängligt, men om programmet misslyckas med något av dessa tester så kan mer arbete behövas för att förbättra den aspekten av dess tillgänglighet.</para>
<section>
<title>Tangentbordsnavigering</title>
<para>Följande tangentbordsoperationer bör testas. Använd inte musen i någon del av detta test.</para>
<itemizedlist>
<listitem>
<para>Flytta fokus genom alla menyrader i programmet med enbart tangentbordskommandon.</para>
</listitem>
<listitem>
<para>Bekräfta att:</para>
<itemizedlist>
<listitem>
<para>Sammanhangskänsliga menyer visas korrekt.</para>
</listitem>
<listitem>
<para>Alla funktioner som listas i verktygsfältet kan utföras med tangentbordet.</para>
</listitem>
<listitem>
<para>Du kan styra varje kontroll i programmets klientområde och dialogrutor.</para>
</listitem>
<listitem>
<para>Text och objekt i klientområdet kan markeras.</para>
</listitem>
<listitem>
<para>Alla tangentbordsgenvägar eller snabbtangenter fungerar som det är tänkt.</para>
</listitem>
</itemizedlist>
</listitem>
</itemizedlist>
</section>
<section>
<title>Grafiska element</title>
<para>Testa programmet med en skärmläsare och bekräfta att:</para>
<itemizedlist>
<listitem>
<para>Etiketter och text läses upp korrekt, inklusive menyer och verktygsfält.</para>
</listitem>
<listitem>
<para>Objektsinformation läses upp korrekt.</para>
</listitem>
</itemizedlist>
</section>
<section>
<title>Indikator för visuellt fokus</title>
<itemizedlist>
<listitem>
<para>Bekräfta att då du rör dig mellan objekt så är indikatorn för visuellt fokus lätt att identifiera.</para>
</listitem>
<listitem>
<para>Tangentbordsnavigering genom programvaran och menyer bör vara klar och tydlig om när fokus förflyttas.</para>
</listitem>
<listitem>
<para>Bekräfta att skärmläsaren spårar indikatorn för visuellt fokus medan du navigerar med ett tangentbord.</para>
</listitem>
<listitem>
<para>Kör ett skärmförstorarprogram (om tillgängligt) och bekräfta att förstoraren kan spåra indikatorn för visuellt fokus medan du navigerar med tangentbord och mus.</para>
</listitem>
</itemizedlist>
</section>
<section>
<title>Typsnitt och text</title>
<itemizedlist>
<listitem>
<para>Ändra typsnittet i programmet och bekräfta att inställningarna bevaras.</para>
</listitem>
<listitem>
<para>Testa programmet genom att ändra färger och bekräfta att alla inställningar bevaras.</para>
</listitem>
<listitem>
<para>Om förstoring finns tillgänglig, testa typsnitt, färg och storlek med förstoringsalternativet.</para>
</listitem>
</itemizedlist>
</section>
<section>
<title>Färg och kontrast</title>
<itemizedlist>
<listitem>
<para>Skriv ut skärmbilder till en svartvit skrivare och bekräfta att all information är synlig.</para>
</listitem>
<listitem>
<para>Testa program med bara svartvita högkontrastinställningar och bekräfta att all information förmedlas korrekt.</para>
</listitem>
<listitem>
<para>Testa att programmet tillhandahåller minst tre kombinationer av färgscheman samt att högkontrastscheman finns tillgängliga (t.ex. vitt på svart eller gult på blått).</para>
</listitem>
<listitem>
<para>Slå på inställningar för hög kontrast i GNOME-kontrollpanelen och bekräfta att programmet respekterar dessa inställningar.</para>
</listitem>
<listitem>
<para>Testa olika teman för att säkerställa att programvaran fungerar med alla inställningar som finns.</para>
</listitem>
</itemizedlist>
</section>
<section>
<title>Ljud</title>
<para>Det bör finnas ett alternativ i programmet för att visa ljudlarm visuellt.</para>
<para>Testa att ljudet fungerar som det ska genom att aktivera ljud i GNOME-kontrollpanelen och sedan utföra följande åtgärder:</para>
<itemizedlist>
<listitem>
<para>Utför en åtgärd som skulle generera ett ljudlarm och bekräfta att programmet fungerar som det är tänkt.</para>
</listitem>
<listitem>
<para>Bekräfta att programmet fungerar korrekt då volymen ökas eller sänks.</para>
</listitem>
<listitem>
<para>Bekräfta att varningsmeddelanden och larm kan höras i en bullrig arbetsmiljö.</para>
</listitem>
</itemizedlist>
</section>
<section>
<title>Animering</title>
<para>Bekräfta att det finns ett alternativ för att stoppa animering och att det fungerar som det är tänkt.</para>
<para>Slå av animeringen. Bekräfta att all information fortfarande förmedlas korrekt.</para>
</section>
<section>
<title>Tangentbordsfokus</title>
<itemizedlist>
<listitem>
<para>Testa alla meddelanden för att bekräfta att användaren får en avisering innan ett meddelandes tidsgräns går ut och ges möjlighet att indikera att mer tid behövs.</para>
</listitem>
<listitem>
<para>Säkerställ att ett alternativ har inkluderats för att justera svarstiden och bekräfta att det fungerar som det är tänkt.</para>
</listitem>
</itemizedlist>
</section>
<section>
<title>Dokumentation</title>
<para>Testa ASCII-textdokumentation med en skärmläsare för att bekräfta att den är tydlig och exakt och kan läsas av hjälpmedelsteknologier.</para>
<para>Testa HTML-program med en webbläsare och skärmläsare för att bekräfta att dokumentationen är tillgänglig för hjälpmedelsteknologier.</para>
<para>Observera: Det finns riktlinjer för webbtillgänglighet på <ulink url="http://www.w3.org/TR/WAI-WEBCONTENT/">http://www.w3.org/TR/WAI-WEBCONTENT/</ulink>.</para>
<para>Bekräfta att följande information finns med i dokumentationen:</para>
<itemizedlist>
<listitem>
<para>Ange om programmet inte stöder standardtangentbordsåtkomsten som används av operativsystemet.</para>
</listitem>
<listitem>
<para>Identifiera om det finns unika tangentbordskommandon.</para>
</listitem>
<listitem>
<para>Identifiera alla unika tillgänglighetsfunktioner.</para>
</listitem>
<listitem>
<para>Om en åtgärd är dokumenterad för musen, säkerställ då att det finns ett alternativ som använder tangentbordet.</para>
</listitem>
</itemizedlist>
</section>
<section id="gad-checklist">
<title>Kontrollista för användargränssnitt</title>
<para>Detta avsnitt sammanfattar riktlinjerna som ges i <link linkend="gad-ui-guidelines">Riktlinjer för användargränssnitt som stöder tillgänglighet</link>. Se det avsnittet i guiden för mer detaljerad information om de objekt i kontrollistan som anges här.</para>
<para>Då du testar ett programs tillgänglighet bör du gå igenom var och en av punkterna i listan. Notera om programmet på varje test har Godkänt eller Icke Godkänt, eller om testet ej är tillämpligt för det programmet.</para>
<table frame="all" pgwide="1">
<title>Kontrollista för generella principer</title>
<tgroup cols="3" align="left">
<thead>
<row>
<entry>GP</entry>
<entry>Generella principer</entry>
<entry>G/IG/-</entry>
</row>
</thead>
<tbody>
<row>
<entry>GP.1</entry>
<entry>Varje åtgärd som ändrar användarens data eller programmets inställningar kan göras ogjord.</entry>
</row>
<row>
<entry>GP.2</entry>
<entry>Alla programinställningar kan återställas till sina standardvärden utan att användaren behöver komma ihåg vad de standardvärdena var.</entry>
</row>
<row>
<entry>GP.3</entry>
<entry>Efter installationen kan programmet användas utan att användaren behöver mata in en diskett eller cd vid något tillfälle.</entry>
</row>
<row><entry>GP.4</entry>
<entry>De vanligast använda funktionerna hittas på menystrukturens toppnivå.</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="all" pgwide="1">
<title>Kontrollista för tangentbordsnavigering</title>
<tgroup cols="3" align="left">
<thead>
<row>
<entry>TN</entry>
<entry>Tangentbordsnavigering</entry>
<entry>G/IG/-</entry>
</row>
</thead>
<tbody>
<row>
<entry>TN.1</entry>
<entry>Effektiv tangentbordsåtkomst tillhandahålls till alla programfunktioner.</entry>
</row>
<row>
<entry>TN.2</entry>
<entry>Alla fönster har en logisk ordning för tangentbordsnavigering.</entry>
</row>
<row><entry>TN.3</entry>
<entry>Den korrekta tabbordningen används för kontroller vars aktiverade tillstånd beror på kryssrutor, radioknappar eller växlingsknappar.</entry>
</row>
<row><entry>TN.4</entry>
<entry>Tangentbordsåtkomst till programspecifika funktioner åsidosätter inte systemets befintliga hjälpmedelsfunktioner.</entry>
</row>
<row><entry>TN.5</entry>
<entry>Programmet tillhandahåller mer än ett sätt att utföra tangentbordsuppgifter närhelst det är möjligt.</entry>
</row>
<row><entry>TN.6</entry>
<entry>Det finns alternativa tangentkombinationer närhelst det är möjligt.</entry>
</row>
<row><entry>TN.7</entry>
<entry>Det används inga tangentkombinationer som är svåra att nå för ofta utförda tangentbordsåtgärder.</entry>
</row>
<row><entry>TN.8</entry>
<entry>Programmet använder inte upprepade samtidiga tangenttryckningar.</entry>
</row>
<row><entry>TN.9</entry>
<entry>Programmet tillhandahåller tangentbordsekvivalenter för alla musfunktioner.</entry>
</row>
<row><entry>TN.10</entry>
<entry>Text eller objekt som kan markeras med musen kan också markeras med bara tangentbordet.</entry>
</row>
<row><entry>TN.11</entry>
<entry>Ett objekt som kan storleksändras eller flyttas med musen kan också storleksändras eller flyttas med bara tangentbordet.</entry>
</row>
<row><entry>TN.12</entry>
<entry>Programmet använder inga allmänna navigeringsfunktioner för att utlösa åtgärder.</entry>
</row>
<row><entry>TN.13</entry>
<entry>Alla tangentbordsstartade menyer, fönster och inforutor dyker upp nära objektet som de är relaterade till.</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="all" pgwide="1">
<title>Kontrollista för musinteraktion</title>
<tgroup cols="3" align="left">
<thead>
<row>
<entry>MI</entry>
<entry>Musinteraktion</entry>
<entry>G/IG/-</entry>
</row>
</thead>
<tbody>
<row><entry>MI.1</entry>
<entry>Inga operationer beror på inmatning från de <mousebutton>högra</mousebutton> eller <mousebutton>mittersta</mousebutton> musknapparna.</entry>
</row>
<row><entry>MI.2</entry>
<entry>Alla musoperationer kan avbrytas innan de har slutförts.</entry>
</row>
<row><entry>MI.3</entry>
<entry>Visuell återkoppling tillhandahålls under dra och släpp-operationer</entry>
</row>
<row><entry>MI.4</entry>
<entry>Muspekaren teleporteras aldrig av programkontroll, och får inte sin rörelse begränsad till en del av skärmen av programmet.</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="all" pgwide="1">
<title>Kontrollista för grafiska element</title>
<tgroup cols="3" align="left">
<thead>
<row>
<entry>GE</entry>
<entry>Grafiska element</entry>
<entry>G/IG/-</entry>
</row>
</thead>
<tbody>
<row><entry>GE.1</entry>
<entry>Det finns inga hårdkodade grafiska attribut så som tjocklek på rad, kant eller skugga.</entry>
</row>
<row><entry>GE.2</entry>
<entry>Alla flerfärgade grafiska element kan visas monokromt när så är möjligt.</entry>
</row>
<row><entry>GE.3</entry>
<entry>Alla interaktiva grafiska användargränssnittselement är lätta att åtskilja från statiska grafiska användargränssnittselement.</entry>
</row>
<row><entry>GE.4</entry>
<entry>Ett alternativ för att dölja mindre viktig grafik tillhandahålls.</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="all" pgwide="1">
<title>Kontrollista för typsnitt och text</title>
<tgroup cols="3" align="left">
<thead>
<row>
<entry>TT</entry>
<entry>Typsnitt och text</entry>
<entry>G/IG/-</entry>
</row>
</thead>
<tbody>
<row><entry>TT.1</entry>
<entry>Inga storlekar eller stilar för typsnitt är hårdkodade.</entry>
</row>
<row><entry>TT.2</entry>
<entry>Ett alternativ för att slå av grafiska bakgrunder bakom text tillhandahålls.</entry>
</row>
<row><entry>TT.3</entry>
<entry>Alla etiketter har namn som är förståeliga då de läses utan sammanhang.</entry>
</row>
<row><entry>TT.4</entry>
<entry>Inga etikettnamn används mer än en gång i samma fönster.</entry>
</row>
<row><entry>TT.5</entry>
<entry>Etikettplacering är konsekvent i hela programmet.</entry>
</row>
<row><entry>TT.6</entry>
<entry>Alla statiska textetiketter som identifierar andra kontroller avslutas med ett kolon (:).</entry>
</row>
<row><entry>TT.7</entry>
<entry>Statiska textetiketter som identifierar andra kontroller kommer omedelbart före dessa kontroller i tabbordningen.</entry>
</row>
<row><entry>TT.8</entry>
<entry>Ett alternativ till WYSIWYG tillhandahålls. Till exempel förmågan att ange olika typsnitt för skärm och skrivare i en textredigerare.</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="all" pgwide="1">
<title>Kontrollista för färg och kontrast</title>
<tgroup cols="3" align="left">
<thead>
<row>
<entry>FK</entry>
<entry>Färg och kontrast</entry>
<entry>G/IG/-</entry>
</row>
</thead>
<tbody>
<row><entry>FK.1</entry>
<entry>Programfärger är inte hårdkodade, utan tas antingen från aktuellt skrivbordstema eller en programinställning.</entry>
</row>
<row><entry>FK.2</entry>
<entry>Färg används bara som en förstärkning, och inte som det enda sättet för att uttrycka information eller åtgärder.</entry>
</row>
<row>
<entry>FK.3</entry>
<entry>Programmet stöder alla teman och inställningar för hög kontrast som finns tillgängliga.</entry>
</row>
<row><entry>FK.4</entry>
<entry>Programmet är inte beroende av något specifikt tema eller inställning för hög kontrast.</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="all" pgwide="1">
<title>Kontrollista för förstoring</title>
<tgroup cols="3" align="left">
<thead>
<row>
<entry>FÖ</entry>
<entry>Förstoring</entry>
<entry>G/IG/-</entry>
</row>
</thead>
<tbody>
<row><entry>FÖ.1</entry>
<entry>Programmet tillhandahåller förmågan att förstora arbetsytan.</entry>
</row>
<row><entry>FÖ.2</entry>
<entry>Programmet tillhandahåller alternativet att skala arbetsytan.</entry>
</row>
<row><entry>FÖ.3</entry>
<entry>Programmets funktionalitet påverkas inte av att ändra inställningarna för förstoring eller skala.</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="all" pgwide="1">
<title>Kontrollista för ljud</title>
<tgroup cols="3" align="left">
<thead>
<row>
<entry>LJ</entry>
<entry>Ljud</entry>
<entry>G/IG/-</entry>
</row>
</thead>
<tbody>
<row><entry>LJ.1</entry>
<entry>Ljud används inte som det enda sättet att uttrycka någon slags information.</entry>
</row>
<row><entry>LJ.2</entry>
<entry>Användaren kan konfigurera frekvensen och volymen för alla ljud och varningspip.</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="all" pgwide="1">
<title>Kontrollista för animering</title>
<tgroup cols="3" align="left">
<thead>
<row>
<entry>AN</entry>
<entry>Animering</entry>
<entry>G/IG/-</entry>
</row>
</thead>
<tbody>
<row><entry>AN.1</entry>
<entry>Det finns inga blixtrande eller blinkande element med en frekvens större än 2Hz eller lägre än 55Hz.</entry>
</row>
<row><entry>AN.2</entry>
<entry>Allt blixtrande eller blinkande är begränsat till små delar av skärmen.</entry>
</row>
<row><entry>AN.3</entry>
<entry>Om animering används finns ett alternativ för att slå av den innan den först visas.</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="all" pgwide="1">
<title>Kontrollista för tangentbordsfokus</title>
<tgroup cols="3" align="left">
<thead>
<row>
<entry>TF</entry>
<entry>Tangentbordsfokus</entry>
<entry>G/IG/-</entry>
</row>
</thead>
<tbody>
<row><entry>TF.1</entry>
<entry>När ett fönster öppnas startar fokus på den mest använda kontrollen.</entry>
</row>
<row><entry>TF.2</entry>
<entry>Aktuell position för inmatningsfokus visas tydligt vid varje tidpunkt.</entry>
</row>
<row><entry>TF.3</entry>
<entry>Inmatningsfokus visas hela tiden i exakt ett fönster.</entry>
</row>
<row><entry>TF.4</entry>
<entry>Lämplig återkoppling, visuell eller med ljud, tillhandahålls när användaren försöker navigera förbi endera ände av en grupp med relaterade objekt.</entry>
</row>
<row><entry>TF.5</entry>
<entry>Standardvarningssignalen (visuell eller ljud) spelas då användaren trycker ner en olämplig tangent.</entry>
</row>
<row><entry>TF.6</entry>
<entry>Det finns tillräcklig ljudinformation för visuellt fokus så att användaren kan lista ut vad som ska göras härnäst.</entry>
</row>
<row><entry>TF.7</entry>
<entry>Då hjälpmedelsfunktioner så som en skärmläsare eller punktskriftsenhet används indikerar det aktuella programmet positionen och innehållet som indikatorn för visuellt fokus har.</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="all" pgwide="1">
<title>Kontrollista för timing</title>
<tgroup cols="3" align="left">
<thead>
<row>
<entry>TM</entry>
<entry>Timing</entry>
<entry>G/IG/-</entry>
</row>
</thead>
<tbody>
<row><entry>TM.1</entry>
<entry>Det finns inga hårdkodade tidsgränser eller tidsbaserade funktioner i programmet.</entry>
</row>
<row><entry>TM.2</entry>
<entry>Visande eller döljande av viktig information utlöses inte bara av muspekarens rörelse.</entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="all" pgwide="1">
<title>Kontrollista för dokumentation</title>
<tgroup cols="3" align="left">
<thead>
<row>
<entry>DK</entry>
<entry>Dokumentation</entry>
<entry>G/IG/-</entry>
</row>
</thead>
<tbody>
<row><entry>DK.1</entry>
<entry>All dokumentation finns i ett tillgängligt format, med textbaserade alternativa beskrivningar för alla figurer och diagram.</entry>
</row>
<row><entry>DK.2</entry>
<entry>Dokumentationen innehåller ett avsnitt som täcker alla programmets hjälpmedelsfunktioner.</entry>
</row>
</tbody>
</tgroup>
</table>
</section>
<section>
<title>GOK (GNOME Onscreen Keyboard)</title>
<note>
<para>Informationen på denna sida är delvis förlegad: GNOME 3:s <application><ulink url="http://wiki.gnome.org/Caribou">Caribou</ulink></application> har ersatt GNOME 2:s <application>gok</application>.</para>
</note>
<para>Ditt program bör vara användbart via <application>gok</application>; tangentinmatning bör genereras fullständigt av <application>gok</application>, inte tangentbordet. Målet här skulle vara att arbeta med ditt program och skrivbordet i allmänhet, och säkerställa att all sorts tangentinmatning kan utföras med skärmtangentbordet.</para>
<para>Programmet <application>gok</application> kommer med GNOME-skrivbordet, så det bör redan finnas tillgängligt. För fullständig dokumentation, se <ulink url="http://www.gok.ca">den officiella webbplatsen för gok</ulink>.</para>
<para>Följ dessa steg för att bekräfta att <application>gok</application> fungerar korrekt med ditt program:</para>
<procedure>
<step>
<para>Logga in i GNOME-skrivbordet</para>
</step>
<step>
<para>Kör <application>gok</application></para>
</step>
<step>
<para>Starta ditt program</para>
</step>
<step>
<para>Tillhandahåll inmatning till ditt program med ett pekdon (t.ex. mus eller huvudspårare) och <application>gok</application>.</para>
</step>
<step>
<para>Arbeta genom att använda funktionerna för automatisk komplettering och ordprediktion i <application>gok</application>.</para>
</step>
<step>
<para>Bekräfta att <application>gok</application> aktiverar och inaktiverar knapparna <guibutton>Menyer</guibutton> och <guibutton>Verktygsfält</guibutton> beroende på typen av program som körs; till exempel inaktiveras knapparna <guibutton>Menyer</guibutton> och <guibutton>Verktygsfält</guibutton> för programmet ”Typsnittsegenskaper”, men samma knappar är aktiverade för programmet <application>Gedit</application>.</para>
</step>
<step>
<para>Bekräfta att <application>gok</application>-skärmtangentbordet som tillhandahålls av knappen <guibutton>Sammansätt</guibutton> kan användas för att skriva in all text för det valda programmet; kör <application>Gedit</application>, klicka på textområdet, och klicka sedan på knappen <guibutton>Sammansätt</guibutton> i <application>gok</application>. Välj tangenterna som behövs från skärmtangentbordet. Tecknen bör dyka upp i <application>Gedit</application>s textområde.</para>
</step>
<step>
<para>Bekräfta att knappen <guibutton>Startare</guibutton> låter användaren starta alla programmen <application>Terminal</application>, <application>Webbläsare</application> och <application>Textredigerare</application>.</para>
</step>
<step>
<para>Bekräfta att knappen <guibutton>Aktivera</guibutton> låter användaren aktivera alla de för närvarande körande programfönstren på användarens skrivbord, inklusive GNOME-paneler och GNOME-skrivbordet.</para>
</step>
<step>
<para>Bekräfta att knappen <guibutton>Menyer</guibutton> listar alla menyer som finns i det aktuella programmet. Bekräfta att ett klick på en menyknapp visar undermenyn och menyobjekten som finns i undermenyn. Bekräfta slutligen att ett klick på ett menyobjekt aktiverar menyobjektet. Klicka till exempel på programmet <application>Hjälpläsare</application> och klicka på knappen <guibutton>Menyer</guibutton>. <application>GOK</application>-fönstret visar nu knapparna <guibutton>Arkiv</guibutton>, <guibutton>Gå</guibutton> och <guibutton>Hjälp</guibutton> (menyerna för <application>Hjälpläsare</application>). Klicka på knappen <guibutton>Arkiv</guibutton> så visar den knapparna <guibutton>Nytt fönster</guibutton> och <guibutton>Stäng fönster</guibutton> (menyobjekt).</para>
</step>
<step>
<para>Säkerställ att knappen <guibutton>Verktygsfält</guibutton> listar alla knappar som finns i programmets verktygsfält. Klicka till exempel på programmet <application>Hjälpläsare</application> och klicka sedan på knappen <guibutton>Verktygsfält</guibutton>. <application>GOK</application>-fönstret visar nu knapparna <guibutton>Bakåt</guibutton>, <guibutton>Framåt</guibutton> och <guibutton>Hem</guibutton>.</para>
</step>
<step>
<para>Bekräfta att knappen <guibutton>Fångst av användargränssnitt</guibutton> visar alla knappobjekt för det markerade programfönstret. Öppna till exempel programmet ”Typsnittsegenskaper” och klicka på knappen <guibutton>Fångst av användargränssnitt</guibutton> i <application>GOK</application>-fönstret. <application>GOK</application>-fönstret bör nu visa namnet på knapparna i programmet - <guibutton>Sans</guibutton>, <guibutton>Sans-serif</guibutton>, <guibutton>Stäng</guibutton> och <guibutton>Hjälp</guibutton>.</para>
</step>
</procedure>
</section>
<section>
<title>Accerciser</title>
<screenshot>
<mediaobject><imageobject> <imagedata fileref="figures/at-arch.png" format="PNG"/> </imageobject> <textobject> <phrase> Accerciser och GNOME:s tillgänglighetsarkitektur </phrase> </textobject></mediaobject>
</screenshot>
<para><application>Accerciser</application> är en interaktiv tillgänglighetsutforskare för GNOME-skrivbordet skriven i Python. Den använder AT-SPI för att inspektera och styra komponenter, vilket låter dig se om ett program tillhandahåller korrekt information till hjälpmedelsteknologier och automatiska testramverk. <application>Accerciser</application> har ett enkelt ramverk för insticksmoduler som du kan använda för att skapa anpassade vyer av tillgänglighetsinformation. Fullständig dokumentation kan hittas <ulink url="http://library.gnome.org/devel/accerciser/stable">i den officiella handboken för Accerciser</ulink>. För en demonstration av <application>Accerciser</application> och <application>PyATSPI</application> (Python-omslagen åtkomst och användning av AT-SPI), se <ulink url="http://live.gnome.org/Accessibility/PythonPoweredAccessibility">denna artikel</ulink>. För en utmärkt genomgång från författaren, se artikeln med titeln <ulink url="http://www.linuxjournal.com/article/9991">Make Your Application Accessible with Accerciser</ulink>.</para>
<note>
<para><application>Accerciser</application> har ersatt det äldre verktyget <application>at-poke</application>.</para>
</note>
</section>
</chapter>
</book>
|