File: index.docbook

package info (click to toggle)
gnome-devel-docs 40.3-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 79,188 kB
  • sloc: javascript: 2,514; xml: 2,407; ansic: 2,229; python: 1,854; makefile: 805; sh: 499; cpp: 131
file content (1672 lines) | stat: -rw-r--r-- 106,021 bytes parent folder | download
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, 
                             &amp;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-&gt;get_text = myatkimp_mytype_get_text; 
   iface-&gt;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", &amp;tinfo, 0); 

      /* This class implements interface ATK_TYPE_TEXT */ 
      g_type_add_interface_static (type, ATK_TYPE_TEXT, 
                                   &amp;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-&gt;init</function>-, <function>parent-&gt;notify_gtk</function>- eller <function>parent-&gt;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-&gt;init</para>
<para>En <function>parent-&gt;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-&gt;notify_gtk</para>
<para>Om ATK-implementationen behöver lyssna på några egenskapsaviseringar på det bakomliggande GTK-objektet, så kan en <function>parent-&gt;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-&gt;name, "property-of-interest") == 0) 
   { 
      /* Hantera egenskapsändringen. */ 
   } 
   else 
   { 
      parent_class-&gt;notify_gtk (obj, pspec); 
   } 
} 
</programlisting>
</example>
</listitem>
<listitem>
<para>parent-&gt;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-&gt;cached_value); 
   G_OBJECT_CLASS (parent_class)-&gt;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>